0
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... 这应该将互斥控制返回到 write_input 线程以打印值。请帮忙...

4

1 回答 1

1

您必须pthread_cond_wait在并且只有在您知道有什么要等待的时候才打电话。您获得了互斥体,因此您可以检查共享状态,但随后您什么也不检查。这不可能是对的。

您必须pthread_cond_signal在且仅当您需要让另一个线程知道您已更改某些内容时才调用。您获取互斥锁,调用pthread_cond_signal并释放互斥锁。但是您没有更改其他线程可能正在等待的任何内容。这不可能是对的。

坦率地说,没有证据表明您了解条件变量的工作原理或如何正确使用它。与条件变量关联的互斥锁必须保护谓词,即您正在等待的东西。但是我在您的代码中没有看到任何谓词的证据,因此没有什么可等待的,也没有任何准备就绪的信号。

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

假设您希望您的线程交替,这里是您的代码固定:

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;
}

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

于 2015-05-05T12:11:55.493 回答