充分私有化 OpenMP 线程中的数据
Adequately privatizing data in OpenMP threads
下面的玩具代码没有做任何我知道的有用信息:
#include <iostream>
#include "omp.h"
using namespace std;
class OtherClass {
public:
OtherClass() {
cout << "hin";
}
int GetNumber(int input) {
int i, num;
int *tmp;
tmp = new int[100];
tmp[0] = 0;
for (i=1;i<100;i++) {
tmp[i] = (input*tmp[i-1]+1)%5;
}
num = tmp[input];
delete[] tmp;
return num;
}
~OtherClass() {
cout << "byen";
}
};
class MainClass {
public:
int *myarray;
MainClass(int numcells) {
myarray = new int[numcells];
}
~MainClass() {
delete[] myarray;
}
};
int main() {
int i;
#define NUMELEMS 100
MainClass *mc = new MainClass(NUMELEMS);
OtherClass *oc = new OtherClass();
#pragma omp parallel private(i)
{
#pragma omp for
for (i=0; i<NUMELEMS; i++ ) {
mc->myarray[i] = oc->GetNumber(omp_get_thread_num()+1);
}
} // end of omp parallel
for (i=0; i<NUMELEMS; i++) {
cout << mc->myarray[i] << "n";
}
delete mc;
delete oc;
}
但它说明了在处理真实代码时我脑海中出现的一个问题。 也就是说,我想知道OtherClass:GetNumber
中的数组tmp
. 如何填充tmp
的详细信息并不重要;我只是输入一些代码来生成一些"有趣"的数字,这些数字会以某种方式因线程而异。 我的问题是,tmp
是否充分保护了可能正在运行的各种线程? 线程在初始化、访问和删除它时是否有可能相互绊倒? 例如,一个线程是否会访问另一个线程定义的tmp
? 或者一个线程可能会在另一个线程可以访问它之前删除tmp
? 如果需要修改,有人可以告诉我应该如何修改代码吗?
顺便说一下,这段代码运行良好。 但我想知道在更复杂、更大的代码中会发生什么。
你的代码是完全安全的。
GetNumber
中发生的任何事情都完全是线程的本地,没有变量或指针转义。准确地说,变量tmp
是每个线程专用的 - 其他线程看不到它。因此,由每个线程分配的tmp
指向的数据对任何其他线程都不可见。
也就是说 - 如果代码是真实代码的任何指示,我强烈建议使用更少的new
/delete
并在堆栈上放置更多对象。它使有关代码的推理变得更加容易 - 尤其是涉及线程。
相关文章:
- 在cuda线程之间共享大量常量数据
- 将线程中的数据存储到全局容器的最佳方法?
- 线程之间的实时数据共享
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 在线程函数中处理数据向量时进行线程竞速
- 使来自线程的数据流对所有其他线程都可读
- 简单使用 std::atomic 在两个线程之间共享数据
- 为什么添加延迟会提高此多线程环境中的数据吞吐量?
- 跨线程共享数据集与拆分每个线程的数据
- 标准 cpp 数据结构和线程互斥锁?
- 在std::线程中使用已分配的结构数据
- 多个线程将数据发送到数组C++
- Qt C++ - 如何将数据从工作线程传递到主线程?
- 在使用 std::cout 和多线程程序中如何避免数据竞争<iomanip>?
- 充分私有化 OpenMP 线程中的数据
- 用于在C++中计算用户数据的线程
- 在不减慢线程速度的情况下保存大量数据
- 线程清理器检测到数据争用,问题出在哪里?
- Qt 如何将数据从一个 GUI 传递到另一个线程