2013-12-13 74 views
0

我在理解为什么此代码导致竞态条件时遇到了一些麻烦。正如我所看到的,只要线程在foo函数中开始,就会用sem_wait阻塞另一个线程,然后在写入myid之后释放该块。但是,我不断得到Thread 2 Thread 2的输出。我不明白这是如何发生的,因为这些块在写周围。有人可以帮我理顺这个吗?信号量(互斥量)示例,竞赛条件

非常感谢。

sem_t s; /* semaphore s */ 

void *foo(void *vargp) 
{ 
    int myid; 
    sem_wait(&s); 
    myid = *((int *)vargp); 
    sem_post(&s); 
    printf("Thread %d\n", myid); 
} 

int main() { 
    pthread_t tid[2]; 
    int i; 
    sem_init(&s, 0, 1); 
    for (i = 0; i < 2; i++) 
      pthread_create(&tid[i], 0, foo, &i); 
    pthread_join(tid[0], 0); 
    pthread_join(tid[1], 0); 
} 

回答

1

您的两个工作线程彼此没有竞争条件,但每个线程都与主线程有竞争条件。工作中的myid = *((int *)vargp);可以与主线程中的i++同时发生。

这是读/写冲突,因此未定义行为,但Thread 2 Thread 2结果似乎最有可能:在新线程开始运行之前,主线程将增加i2pthread_create只创建“就绪”线程,不需要安排它立即运行。

+0

真棒回复,谢谢。 – A4Treok