如何使线程2,3和4等待来自thread1的相同信号?

时间:2017-10-03 09:08:29

标签: c multithreading pthreads

我有一个函数由thread1,2,3,4执行....一旦thread1访问该函数,我使用thread_cond来等待其他线程。一旦thread1完成它的工作,我将thread_signal发送到同一个cond。 Thread2正在执行该功能。但在完成执行后,其他线程无法访问该功能。

请帮帮我

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

int limit = 0;
pthread_mutex_t mutex[100];
pthread_cond_t cond[100];
pthread_t tid[100];

void *enter()
{
    if (limit == 1)
    {
        printf("waiting\n");
        pthread_cond_wait(&cond[1],&mutex[1]);
    }
    gotofunction();
}

void gotofunction()
{
    limit++;
    /* Do work */
    printf("Doing work\n");
    sleep(1);
    limit--;
    printf("Going to give signal\n");
    pthread_cond_signal(&cond[1]);
}

int main()
{
    int n,i;
    scanf("%d",&n);
    for (i=0;i<100;i++)
    {
        pthread_mutex_init(&mutex[i], NULL);
        pthread_cond_init(&cond[i], NULL);
    }
    for (i=0;i<n;i++)
    {
        pthread_create(&tid[i], NULL, enter, NULL);
        sleep(0.5);
    }
    for (i=1;i<=n;i++)
    {
        pthread_join(tid[i], NULL);
    }
}

基本上,thread1打印&#34;做工作&#34; Thread2打印&#34;做工作&#34; 然后其他线程没有任何反应

1 个答案:

答案 0 :(得分:0)

在调用时,必须将传递给pthread_cond_wait()的互斥锁锁定。在检查并更改条件变量与之配对的条件时,也必须锁定该互斥锁(在这种情况下,limit == 1就是那个条件)。

您还应该使用模式while (condition) { pthread_cond_wait() }(而不是if (condition)),因为条件变量可能会在条件实际为真的情况下被唤醒。

更改代码以锁定访问limit周围的互斥锁,并在模拟工作时将其解锁,如下所示:

void *enter()
{
    pthread_mutex_lock(&mutex[1]);
    while (limit == 1)
    {
        printf("waiting\n");
        pthread_cond_wait(&cond[1],&mutex[1]);
    }
    gotofunction();
    pthread_mutex_unlock(&mutex[1]);
    return NULL;
}

void gotofunction()
{
    limit++;
    pthread_mutex_unlock(&mutex[1]);

    /* Do work */
    printf("Doing work\n");
    sleep(1);

    pthread_mutex_lock(&mutex[1]);
    limit--;
    printf("Going to give signal\n");
    pthread_cond_signal(&cond[1]);
}

当然,当您检查限制为1时,您可以使用普通的互斥体 - 但是可以通过将条件更改为while (limit >= N)来扩展此方案以允许N个线程同时执行工作。 / p>