Multithreading 信号量(互斥)示例,竞争条件

Multithreading 信号量(互斥)示例,竞争条件,multithreading,mutex,semaphore,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 *)va

我很难理解为什么这段代码会导致竞争条件。在我看来,只要一个线程在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);
}
sem_t s;/*信号量*/
void*foo(void*vargp)
{
int-myid;
sem_wait&s;
myid=*((int*)vargp);
sem_post&s;
printf(“线程%d\n”,myid);
}
int main(){
pthread_t tid[2];
int i;
sem_init(&s,0,1);
对于(i=0;i<2;i++)
pthread_创建(&tid[i]、0、foo和&i);
pthread_join(tid[0],0);
pthread_join(tid[1],0);
}

您的两个工作线程彼此之间没有争用条件,但每个工作线程都与主线程具有争用条件<代码>myid=*((int*)vargp)可以与主线程中的
i++
同时出现

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