【发布时间】:2021-11-06 13:47:06
【问题描述】:
我有一个使用 MPI + Pthread 的程序。我坚持实现 pthreads 来共享一个用于读/写的数组。我在这里做了模拟代码,模仿了这个问题。
#include <iostream>
#include <unistd.h>
#include <pthread.h>
struct args {
double* array;
int start;
int stop;
double myVal;
double* row;
pthread_barrier_t* barrier;
};
void* mythread(void* arguments){
struct args* args_ = (struct args*)arguments;
double* array = args_->array;
int start = args_->start;
int stop = args_->stop;
double myVal = args_->myVal;
pthread_barrier_t* barrier = args_->barrier;
double* row = args_->row;
for(int i = start; i < stop; i++){
pthread_barrier_wait(barrier);
for(int j = 0; j < 10; j++){
double a = row[j];
int ind = i*10 + j;
array[ind] = a + myVal;
}
}
}
int main(){
pthread_t threads[50];
int start_ = 0;
double* array_0 = NULL;
array_0 = new double[100*10];
double* row = NULL;
row = new double[10];
pthread_barrier_t barrier;
(void)pthread_barrier_init(&barrier, NULL, 50+1);
for(int n = 0; n < 50; n++){
struct args args_;
args_.start = start_;
args_.stop = start_ + 2;
start_ = start_ + 2;
args_.array = &array_0[0];
args_.myVal = n;
args_.row = row;
args_.barrier = &barrier;
(void)pthread_create(&threads[n], NULL, mythread, (void*)&args_);
}
for(int i = 0; i < 2; i++){
for(int k = 0; k < 10; k++){
row[k] = i+1;
}
// usleep(100);
pthread_barrier_wait(&barrier);
}
for(int n = 0; n < 50; n++){
(void)pthread_join(threads[n], NULL);
}
// print
for(int i = 0; i < 100; i++){
for(int j = 0; j < 10; j++){
int ind = i*10 + j;
std::cout << " " << array_0[ind];
}
std::cout << std::endl;
}
return 0;
}
Main 生成 50 个线程。屏障初始化为 50 + 1(包括主线程)。这应该同步 pthread_barrier_wait() 调用上的所有 51 个线程,但阻塞等待调用似乎不允许“行”数组写入循环在释放之前完成。
预期的结果应该是:
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5
.
.
.
.
.
.
etc.
实际输出是半随机的。它在某些线程中完成了序列,而在其他线程中显示为零,好像“行”从未被填充。在写入“行”数组后添加 usleep() 也无济于事 - 不是我能负担得起睡眠我的代码中的函数。这让我相信我不明白指针数组是如何在线程之间正确共享的。我是 C++ 新手,所以任何帮助表示赞赏。
【问题讨论】:
-
请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example。
标签: c++ multithreading pthreads barrier