我正在尝试用pthreads学习编程,这是我试图解决的问题。我有一个数组,让我们说10个输入,我有3个线程,我希望每个线程从数组中读取一个项目,直到数组耗尽。
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初始化第一个,另一个用0初始化,一旦我们创建线程,所有线程将尝试获取其信号量,将sem值初始化为0的两个线程必须等待,值为1的线程将完成工作。一旦第一个完成,它将发布到第二个,当第二个完成时,它将发信号通知第三个,依此类推,直到遍历数组中的所有元素。
但是,当我尝试运行以下程序时,会出现段错误。我不确定发生了什么。有人可以给我一些关于我做错的指示。我写的代码如下所示。
//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 :(得分:2)
当count
大于2时,这将失败:
sem_wait( &sem[count] );
除此之外,您似乎误解了线程的用途。线程用于并行执行计算。你有效地将它们同步,一个接一个地运行,除了额外的问题之外什么都没有。