pthread使用pthread_cond_signal()和pthread_cond_wait()无法正常工作

时间:2016-10-18 03:40:07

标签: c pthreads

我使用pthread_cond_wait()pthread_cond_signal()函数来创建多线程程序。它正常工作,如果条件正确,但条件不正确,它不工作,它不会忽略函数printinput(),它保持在这里,不运行继续。你能帮我检查这个错误吗?

我的代码:

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

pthread_mutex_t mutex;
pthread_cond_t cond;

//Read input value
void* readinput(void *arg)
{
    pthread_mutex_lock(&mutex);
        int a;
        printf("Input:");
        scanf("%d",&a);
        printf("Value: %d\n",a);
        /*
        if condition correct then "printinput" function
        else ignore that function
        */
        if (a>=2 && a<=8)
        {
            pthread_cond_signal(&cond);
        }
    pthread_mutex_unlock(&mutex);
    pthread_exit((void *)a);
}

//print input value if condition correctly
void* printinput(void *arg)
{
    pthread_mutex_lock(&mutex);
    //Block and wait for cond Singal
        pthread_cond_wait(&cond,&mutex);
        printf("Your value between 2 and 8 \n\n");
    pthread_mutex_unlock(&mutex);
    pthread_exit(NULL);
}
int main()
{
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);
    pthread_t th1;
    pthread_t th2;
    while (1)
    {

        //Create pthread
        pthread_create(&th1,NULL,&printinput,NULL);
        pthread_create(&th2,NULL,&readinput,NULL);

        //Wait pthread done
        pthread_join(th1,NULL);
        pthread_join(th2,NULL);
        Sleep(1000);
    }
}

结果:

Input:5 
Value: 5 
Your value between 2 and 8 
Input:10 Value: 10

1 个答案:

答案 0 :(得分:0)

pthread_cond_wait()暂停当前线程,直到发出相关条件为止。

对于输入5,第一个线程表示该条件是if (a >= 2 && a <= 8)块的一部分。

对于输入10,将跳过上述块,因此永远不会发出条件信号。因此,第二个线程永远不会被唤醒并永远被卡住。

另外,请注意有竞争条件,我真的很惊讶该程序经常工作。如果第一个线程锁定互斥锁,则第二个线程不会进入互斥锁部分直到第一个线程函数完成,因此在调用该条件的等待之前发出条件信号。在这种情况下,第二个线程也会永远被卡住。

对于以您期望的方式工作的解决方案(即从第二个线程中的第一个线程消耗true / false),我建议实现第一个线程发送输出而第二个线程消耗的队列它。它也会修复竞争条件。有关实现,请参阅示例https://stackoverflow.com/a/4577987/4787126