我在理解为什么这段代码导致竞争条件时遇到了一些麻烦。正如我所看到的,一旦线程在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);
}
答案 0 :(得分:1)
你的两个工作线程彼此没有竞争条件,但每个线程都有主线程的竞争条件。 worker中的myid = *((int *)vargp);
可以与主线程中的i++
同时发生。
这是读/写冲突和未定义的行为,但Thread 2 Thread 2
结果似乎最有可能:主线程会在新线程开始运行之前将i
增加到2
。 pthread_create
只创建“就绪”线程,不需要安排立即运行。