thread:pthread_cond_signal()在等待条件下不控制另一个线程

时间:2015-05-05 10:06:10

标签: linux multithreading pthreads mutex pthread-join

extern "C"
{
        #include<pthread.h>
}
#include<iostream>
using namespace std;

pthread_mutex_t mutex_var = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var= PTHREAD_COND_INITIALIZER;
int A;

void * read_input(void* a)
{
        int t;
        cout<<" reading .... using thread1 "<<endl;
        for(;;)
        {
                pthread_mutex_lock(&mutex_var);
                cout<<" input value of A "<<endl;
                cin >> A;
                cout<<" A---> VALUE Changed to inputed one"<<endl;
                t=pthread_cond_signal( &cond_var );
                if(t==0)
                {
                        cout<<"logsss"<<endl;
                }
                pthread_mutex_unlock(&mutex_var);
               // pthread_cond_signal( &cond_var );
                if(A==10)
                {
                        pthread_exit(NULL);
                }
        }


}
void * write_input( void * b)
{
        cout<<" writing .... using thread2 "<<endl;
        for(;;)
        {
                pthread_mutex_lock(&mutex_var);
                pthread_cond_wait( &cond_var ,&mutex_var );

                cout<< " value of (A)= "<<A <<endl;


                pthread_mutex_unlock(&mutex_var);
                if(A==10)
                {
                        pthread_exit(NULL);
                }

        }


}

int main()
{
        pthread_t r,w;
        pthread_create(&w,NULL,&write_input,NULL);
        pthread_create(&r,NULL,&read_input,NULL);

        pthread_join(w,NULL);
        pthread_join(r,NULL);

        return 0;
}

这里我尝试使用read_input读取输入,然后使用write_input打印该值...

但它继续在read_input循环中并且没有控制write_input ...这应该将mutex控制重新引导到write_input线程以打印该值。 请帮忙......

1 个答案:

答案 0 :(得分:1)

当您知道有什么需要等待的时候,您必须致电pthread_cond_wait。您获得了互斥锁,因此您可以检查共享状态,但之后您不会检查任何内容。这可能是对的。

您必须在需要让另一个线程知道您已更改某些内容的时候,才会调用pthread_cond_signal。您获取互斥锁,调用pthread_cond_signal,然后释放互斥锁。但是你还没有改变其他线程可能正在等待的东西。这可能是对的。

直言不讳地,没有证据表明您了解条件变量的工作原理或如何正确使用条件变量。与条件变量关联的互斥锁必须保护谓词,即您正在等待的事物。但是我没有看到你的代码中有任何谓词的证据,所以没有什么可以等待的,也没有任何准备就绪的信号。

您可以找到使用条件变量here的基础知识的一个很好的解释。其他一些答案也很有帮助。

假设您希望自己的线程处于备用位置,请修改以下代码:

extern "C"
{
    #include<pthread.h>
}
#include<iostream>
using namespace std;

pthread_mutex_t mutex_var = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var= PTHREAD_COND_INITIALIZER;
bool read_turn = true;
int A;

void * read_input(void* a)
{
    int t;
    cout<<" reading .... using thread1 "<<endl;
    for(;;)
    {
        pthread_mutex_lock(&mutex_var);

        // Wait our turn
        while (!read_turn)
            pthread_cond_wait ( &cond_var, &mutex_var );

        cout<<" input value of A "<<endl;
        cin >> A;
        cout<<" A---> VALUE Changed to inputed one"<<endl;

        // It's now the other thread's turn
        read_turn = false;
        t=pthread_cond_signal( &cond_var );

        if(t==0)
        {
            cout<<"logsss"<<endl;
        }
        pthread_mutex_unlock(&mutex_var);
           // pthread_cond_signal( &cond_var );
        if(A==10)
        {
            pthread_exit(NULL);
        }
    }
}
void * write_input( void * b)
{
    cout<<" writing .... using thread2 "<<endl;
    for(;;)
    {
        pthread_mutex_lock(&mutex_var);

        // Wait our turn
        while (read_turn)
            pthread_cond_wait( &cond_var ,&mutex_var );

        cout<< " value of (A)= "<<A <<endl;


        // Now it's the other guy's turn
        read_turn = true;
        pthread_cond_signal (& cond_var );
        if(A==10)
        {
            pthread_mutex_unlock(&mutex_var);
            pthread_exit(NULL);
        }


        pthread_mutex_unlock(&mutex_var);
    }


}

int main()
{
    pthread_t r,w;
    pthread_create(&w,NULL,&write_input,NULL);
    pthread_create(&r,NULL,&read_input,NULL);

    pthread_join(w,NULL);
    pthread_join(r,NULL);

    return 0;
}

请注意,只有在知道有什么需要等待的时候才会等待。并注意它发出信号的时间,并且仅当它改变了另一个线程可能正在等待的某个共享状态时。