2016-12-14 2 views
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 будет блокироваться дважды. Если sem_post с в func_thread1 и в func_thread2 выполнены, func_thread3 может продолжаться.

Однако, это не сработает, если я не добавлю pthread_join(td3, NULL) в main. Я думаю, что соединение не обязательно, потому что sem_wait может блокировать.

Нужно использовать pthread_join или использовать семафор неправильно?

ответ

0

pthread_join является обязательным в вашей реализации.

В противном случае процесс заканчивается (т. Е. Основной возврат), и все задачи (т. Е. Потоки) уничтожаются до того, как нить 3 напечатает что-либо.

+0

http://man7.org/linux/man-pages/man3/sem_wait.3.html – Yves

+0

sem_wait() уменьшает (блокирует) семафор, на который указывает sem. Если значение семафора больше нуля, то декремент продолжается, и функция немедленно возвращается. Если семафор в настоящее время имеет нулевое значение, тогда блокирует блокировку до тех пор, пока не будет выполнено значение (то есть значение семафора выше нуля) или обработчик сигнала прерывает вызов. – Yves

+0

Вы видите, «если семафор в настоящее время имеет значение ноль, тогда блокировки вызовов ...». Что здесь означает блок? – Yves