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
будет блокироваться дважды. Если sem_post
с в func_thread1
и в func_thread2
выполнены, func_thread3
может продолжаться.
Однако, это не сработает, если я не добавлю pthread_join(td3, NULL)
в main
. Я думаю, что соединение не обязательно, потому что sem_wait
может блокировать.
Нужно использовать pthread_join
или использовать семафор неправильно?
http://man7.org/linux/man-pages/man3/sem_wait.3.html – Yves
sem_wait() уменьшает (блокирует) семафор, на который указывает sem. Если значение семафора больше нуля, то декремент продолжается, и функция немедленно возвращается. Если семафор в настоящее время имеет нулевое значение, тогда блокирует блокировку до тех пор, пока не будет выполнено значение (то есть значение семафора выше нуля) или обработчик сигнала прерывает вызов. – Yves
Вы видите, «если семафор в настоящее время имеет значение ноль, тогда блокировки вызовов ...». Что здесь означает блок? – Yves