信号量(Mutex)示例,竞争条件

时间:2013-12-13 19:14:42

标签: multithreading mutex semaphore

我在理解为什么这段代码导致竞争条件时遇到了一些麻烦。正如我所看到的,一旦线程在foo函数中开始,它就会用sem_wait阻塞另一个线程,然后在写入myid之后释放该块。但是,我一直得到线程2线程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 个答案:

答案 0 :(得分:1)

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

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