2015-09-12 6 views
1

Я пытаюсь изучить программирование с помощью pthreads, и вот проблема, которую я пытаюсь решить. У меня есть массив с разрешением 10 входов, и у меня есть 3 потока, я хочу, чтобы каждый поток читал один элемент из массива, пока массив не исчерпался.Невозможно понять поведение pthread

int arr[10] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; 

Я хотел бы, 3 нити, чтобы работать следующим образом:

T1 T2 T3 T1 T2 
10 11 12 13 14 

То, что я попытался это, я взял 3 sempahores, по одному для каждого потока инициализируется первый с 1, и other with 0, как только мы создадим потоки, все потоки попытаются получить их семафоры, два потока, которые имеют значение sem, инициализированное равным 0, должны будут ждать, тот, у кого значение 1, получит работу. Как только первый будет выполнен, он будет отправлен на второй, а когда второй будет выполнен, он будет сигнализировать третью и так далее, пока не пройдут все элементы массива.

Однако, когда я пытаюсь запустить следующую программу, это segfaults. Я не уверен, что происходит. Может кто-нибудь, пожалуйста, дайте мне несколько указаний относительно того, что я делаю неправильно. Код, который я написал, показан ниже.

//Read one element using one thread 

#include<pthread.h> 
#include <semaphore.h> 
#include <iostream> 

using namespace std; 

int arr[10] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; 

sem_t sem[3]; 
int count = 0; 

void * printNumbers( void * arg) { 

    while(1) { 
     sem_wait(&sem[count]); 
     cout<< " Waiting on the semaphore number " << count << endl; 
     count += 1; 
     if(count > 9) 
      break; 
     cout<< " consuming " << arr[count]<< " with thid " << * ((int*) arg) << endl; 
     int nextPost = count % 3; 
     cout<< " Posting to semaphore number " << nextPost << endl; 
     sem_post(&sem[nextPost]); 
     } 
} 

int main() { 

    sem_init(&sem[0], NULL, 1); 
    sem_init(&sem[1], NULL, 0); 
    sem_init(&sem[2], NULL, 0); 

    int t1 = 0; 
    int t2 = 1; 
    int t3 = 2; 

    pthread_t thid[3]; 
    pthread_create(&thid[0], NULL, printNumbers, &t1); 
    pthread_create(&thid[1], NULL, printNumbers, &t2); 
    pthread_create(&thid[2], NULL, printNumbers, &t3); 
    pthread_exit(0); 
    return 0; 
} 
+0

Строка 'sem_wait (& sem [count]);' должна быть 'sem_wait (& sem [* ((int *) arg)]); вместо этого - почему вы пытаетесь сериализовать работу потоков? – MikeMB

ответ

2

count Когда больше, чем 2, это не получится:

sem_wait(&sem[count]); 

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

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