2015-05-05 2 views
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 ...нить: pthread_cond_signal() не дает контроль над другим потоком на ожидание состояния

, но это продолжается в read_input loop и не давая контроль над write_input ..., который должен возвращать управление мьютексом в write_input поток для печати значения. , пожалуйста, помогите ...

+0

Это очень поможет, если вы объясните, что вы ожидаете от этого кода, потому что это не имеет большого смысла. Вы ожидаете, что поток 'write_input' будет записывать каждый вход? Если да, то не нужно, чтобы поток 'read_input' должен был дождаться завершения записи до того, как он прочитает следующий ввод? –

ответ

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

Обратите внимание, что он ждет, когда, и только тогда, когда он знает, что есть что-то ждать. И обратите внимание, что он сигнализирует, когда и только когда он изменил какое-то общее состояние, которое ожидает другой поток.

+0

Спасибо, это был мой первый маленький код на тему .. немного запутанный .. но я получил вашу мысль. –