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线程以打印该值。 请帮忙......
答案 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;
}
请注意,只有在知道有什么需要等待的时候才会等待。并注意它发出信号的时间,并且仅当它改变了另一个线程可能正在等待的某个共享状态时。