Multithreading 信号量(互斥)示例,竞争条件
我很难理解为什么这段代码会导致竞争条件。在我看来,只要一个线程在foo函数中开始,它就会用sem_wait阻塞另一个线程,然后在写入myid后释放该块。但是,我一直得到线程2线程2的输出。我不明白这是怎么发生的,因为写操作周围有块。有人能帮我解释一下吗 非常感谢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
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
只创建“就绪”线程,不需要计划立即运行