我有一個資源需要在訪問之間保持其狀態。當使用OpenMP並行化程序時,我想確保每個線程都有自己的副本,並且實例不會被銷燬,並且不會爲每個並行區域重新創建實例。爲此,我使用了一個全局變量,即threadprivate
。下面,我有一個簡單的測試用例來說明設置。c + +中的OpenMP和資源管理
我有兩個問題:
- 能夠保證所有的資源(以下OBJ)是該計劃的執行期間創建的每個線程只有一次?
- 當我在四個線程上運行示例程序時,每個線程都會報告「Obj created ...」和「State set to ...」,但只有線程爲零報告「Obj destroyed ...」。這裏發生了什麼?
#ifdef _OPENMP
#include <omp.h>
#endif
#include <vector>
#include <iostream>
#include <iomanip>
class obj {
public:
obj() : state(0) {
res = new int [100];
#pragma omp critical
{
std::cout << "Obj created, state " << state;
#ifdef _OPENMP
std::cout << ", thread " << omp_get_thread_num();
#endif
std::cout << std::endl;
}
}
~obj() {
delete[] res;
#pragma omp critical
{
std::cout << "Obj destroyed, state " << state;
#ifdef _OPENMP
std::cout << ", thread " << omp_get_thread_num();
#endif
std::cout << std::endl;
}
}
void init(int set) {
state = set;
#pragma omp critical
{
std::cout << "State set to " << state;
#ifdef _OPENMP
std::cout << ", thread " << omp_get_thread_num();
#endif
std::cout << std::endl;
}
}
int operator()() {
return ++state;
}
private:
int state;
int* res;
};
extern obj obj1;
#pragma omp threadprivate(obj1)
obj obj1;
void init() {
#ifdef _OPENMP
#pragma omp parallel
{
obj1.init(100 * omp_get_thread_num());
}
#else
obj1.init(100);
#endif
}
void work() {
std::cout << "Computing" << std::endl;
int constexpr length = 20;
std::vector<int> vec(length);
#pragma omp parallel for
for (int idx = 0; idx < length; idx++) {
vec[idx] = obj1();
}
std::cout.fill('0');
for (auto const & e: vec) {
std::cout << std::setw(3) << e << ' ';
}
std::cout << std::endl;
}
int main() {
init();
work();
work();
work();
}
嗯,我猜測,當obj1超出範圍,(在主結束時我猜想它是全局變量),其他線程已經死了 – Guiroux