2014-11-28 3 views
0

Я не мог найти, где ошибка в следующей программе для печати четных и нечетных н.у.к., используя два threads.Please предложитьC++ многопоточность

#include<iostream> 
using namespace std; 
pthread_mutex_t t1 = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER; 
void* print_even(void*); 
void* print_odd(void*); 
static int data = 0; 

int main() 
{ 
    pthread_t a[2]; 
    pthread_create(&a[0],NULL,print_even,NULL); 
    pthread_create(&a[1],NULL,print_odd,NULL); 
    pthread_join(a[0],NULL); 
    pthread_join(a[1],NULL); 
    pthread_exit(NULL); 
} 
void* print_even(void* p) 
{ 
do{ 
    pthread_mutex_lock(&t1); 
    if(data%2 != 0) 
    { 
     pthread_cond_wait(&cond,&t1); 
    } 
cout<<data; 
data++; 
pthread_cond_signal(&cond); 
if(data > 10){ 
    pthread_mutex_unlock(&t1); 
    break; 
    } 
pthread_mutex_unlock(&t1); 
}while(1); 
} 
void* print_odd(void* p) 
{ 
    do{ 
    pthread_mutex_lock(&t1); 
    if(data%2 != 1) 
    { 
     pthread_cond_wait(&cond,&t1); 
    } 
    cout<<data; 
} 
    data++; 
    pthread_cond_signal(&cond); 
    if(data > 10) 
    { 
     pthread_mutex_unlock(&t1); 
     break; 
    } 
    }while(1); 
} 
+4

В чем проблема? – Eun

ответ

2

Основными проблемами являются:

  • Каждый поток нужно ждать другой переменной условия и сигнализировать о другом потоке. У вас есть оба ожидания на одном и том же.
  • Вам необходимо разблокировать мьютексы после сигнализации, поэтому другой поток может заблокировать его и продолжить.
  • Вы должны повторно проверить состояние после пробуждения, если пробуждение было ложным.

Петля в каждом потоке должен выглядеть как

while (data <= 10) { 
    pthread_mutex_lock(&t1); 
    while (data%2 != 0) {    // 1 in the other thread 
     pthread_cond_wait(&cond,&t1); // cond1 in the other thread 
    } 
    cout<<data; 
    data++; 
    pthread_cond_signal(&cond1);  // cond in the other thread 
    pthread_mutex_unlock(&t1); 
} 

Я взял на себя смелость реструктуризации цикла менее странно, и более очевидным, что мьютекс правильно разблокирован каждый раз. Если вы не застряли в древнем компиляторе, я бы рекомендовал использовать библиотеку потоков C++ (с красивыми замками в стиле RAII), а не возиться с потоками Posix.

Смежные вопросы