gpt4 book ai didi

c++ - 无法理解 pthread 行为

转载 作者:行者123 更新时间:2023-11-30 03:49:26 25 4
gpt4 key购买 nike

我正在尝试学习使用 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 个信号量,每个线程一个,并将第一个初始化为 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;
}

最佳答案

count 大于 2 时,这将失败:

sem_wait( &sem[count] );

除此之外,您似乎误解了线程的用途。线程用于并行执行计算。您可以有效地同步它们一个接一个地运行,但只会带来更多问题。

关于c++ - 无法理解 pthread 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32535588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com