0
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块
在我看来,sem_wait
将阻止两次。如果执行func_thread1
和func_thread2
中的sem_post
s,func_thread3
可能会继续。
但是,它不起作用,除非我在main
中添加pthread_join(td3, NULL)
。我认为加入没有必要,因为sem_wait
可以阻止。
所以pthread_join
是必要的,或者我错误地使用信号量?
http://man7.org/linux/man-pages/man3/sem_wait.3.html – Yves
sem_wait()递减(锁定)由sem指向的信号量。如果 信号量的值大于零,则减量 继续,并且函数立即返回。如果信号量 当前具有零值,则呼叫阻塞,直到其可能执行减量(即,信号量值 上升到零以上),或者信号处理器中断呼叫。 – Yves
您会看到,“如果信号量当前值为零,则呼叫阻止...”。块在这里意味着什么? – Yves