Я пытаюсь изучить программирование с помощью 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;
}
Строка 'sem_wait (& sem [count]);' должна быть 'sem_wait (& sem [* ((int *) arg)]); вместо этого - почему вы пытаетесь сериализовать работу потоков? – MikeMB