2016-12-14 29 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块等待td1td2
为什么不sem_wait块

在我看来,sem_wait将阻止两次。如果执行func_thread1func_thread2中的sem_post s,func_thread3可能会继续。

但是,它不起作用,除非我在main中添加pthread_join(td3, NULL)。我认为加入没有必要,因为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