为什么不sem_wait阻止

时间:2016-12-14 10:41:01

标签: c semaphore

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_postfunc_thread1中的func_thread2被执行,func_thread3可以继续。

但是,除非我在pthread_join(td3, NULL)中添加main,否则它无效。我认为加入不是必要的,因为sem_wait可以阻止。

所以pthread_join是必要的还是我错误地使用信号量?

1 个答案:

答案 0 :(得分:0)

<RelativeLayout android:layout_width="match_parent" -->@dimen/img_wdth android:layout_height="match_parent" -->@dimen/img_hght xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:layout_width="@dimen/img_wdth" android:layout_height="@dimen/img_hght" android:layout_alignParentLeft="true" android:layout_marginLeft="15dp" android:id="@+id/usr_name_img" android:src="@drawable/user" android:tint="#ffffff" android:layout_marginTop="@dimen/img_mrgn_top" /> 在您的实施中是强制性的。

否则你的进程完成(即主要返回),并且所有任务(即线程)在线程3打印任何内容之前被杀死。