为什么 sem_wait 不阻止
why doesn't sem_wait block
static int res1 = 0;
static int res2 = 0;
static int res3 = 0;
static int counter = 0;
static sem_t sem;
void * func_thread1(void *p)
{
sleep(2);
res1 = 1;
printf("func_thread1\n");
sem_post(&sem);
return NULL;
}
void * func_thread2(void *p)
{
sleep(2);
res2 = 2;
printf("func_thread2\n");
sem_post(&sem);
return NULL;
}
void * func_thread3(void *p)
{
sem_wait(&sem);
sem_wait(&sem);
res3 = res1 + res2;
printf("func_thread3\n");
return NULL;
}
void main()
{
sem_init(&sem, 0, counter);
pthread_t pd1, pd2, pd3;
pthread_create(&pd1, NULL, func_thread1, NULL);
pthread_create(&pd2, NULL, func_thread2, NULL);
pthread_create(&pd3, NULL, func_thread3, NULL);
//pthread_join(pd3, NULL);
printf("main_thread\n");
printf("%d", res3);
}
我正在尝试了解信号量的工作原理。
我正在尝试让 td3
块等待 td1
和 td2
.
在我看来,sem_wait
会阻塞两次。如果 func_thread1
和 func_thread2
中的 sem_post
被执行,func_thread3
可以继续。
但是,除非我在main
中添加pthread_join(td3, NULL)
,否则它不起作用。我认为加入是不必要的,因为 sem_wait
可以阻止。
所以 pthread_join
是必要的还是我错误地使用了信号量?
pthread_join
在您的实施中是强制性的。
否则您的进程完成(即 main returns),并且所有任务(即线程)在线程 3 打印任何内容之前被终止。
static int res1 = 0;
static int res2 = 0;
static int res3 = 0;
static int counter = 0;
static sem_t sem;
void * func_thread1(void *p)
{
sleep(2);
res1 = 1;
printf("func_thread1\n");
sem_post(&sem);
return NULL;
}
void * func_thread2(void *p)
{
sleep(2);
res2 = 2;
printf("func_thread2\n");
sem_post(&sem);
return NULL;
}
void * func_thread3(void *p)
{
sem_wait(&sem);
sem_wait(&sem);
res3 = res1 + res2;
printf("func_thread3\n");
return NULL;
}
void main()
{
sem_init(&sem, 0, counter);
pthread_t pd1, pd2, pd3;
pthread_create(&pd1, NULL, func_thread1, NULL);
pthread_create(&pd2, NULL, func_thread2, NULL);
pthread_create(&pd3, NULL, func_thread3, NULL);
//pthread_join(pd3, NULL);
printf("main_thread\n");
printf("%d", res3);
}
我正在尝试了解信号量的工作原理。
我正在尝试让 td3
块等待 td1
和 td2
.
在我看来,sem_wait
会阻塞两次。如果 func_thread1
和 func_thread2
中的 sem_post
被执行,func_thread3
可以继续。
但是,除非我在main
中添加pthread_join(td3, NULL)
,否则它不起作用。我认为加入是不必要的,因为 sem_wait
可以阻止。
所以 pthread_join
是必要的还是我错误地使用了信号量?
pthread_join
在您的实施中是强制性的。
否则您的进程完成(即 main returns),并且所有任务(即线程)在线程 3 打印任何内容之前被终止。