#include
int alpha[10], beta[10], i;
#pragma omp threadprivate(alpha) // alpha 為線程私有
int main() {
// 第一個並行區域:初始化
#pragma omp parallel private(i, beta)
{
int id = omp_get_thread_num();
for (i = 0; i < 10; i++)
alpha[i] = beta[i] = id * i; // 每線程獨立副本
}
// 第二個並行區域:驗證持久性
#pragma omp parallel
printf("I am thread %d : alpha[3] = %d, beta[3] = %d\n",
omp_get_thread_num(), alpha[3], beta[3]);
return 0;
}
I am thread 0 : alpha[3] = 0, beta[3] = 0 I am thread 3 : alpha[3] = 9, beta[3] = 0 I am thread 2 : alpha[3] = 6, beta[3] = 0 I am thread 1 : alpha[3] = 3, beta[3] = 0
| 變量 | 屬性 | 第一並行區 | 第二並行區 | 說明 |
|---|---|---|---|---|
| alpha | threadprivate | 各線程初始化獨立副本 | 保留第一區的值 | 全局生命週期,線程隔離 |
| beta | private(區域) | 各線程初始化獨立副本 | 未初始化(垃圾值) | 僅在當前並行區有效 |
#pragma omp threadprivate 必須放在文件作用域,變量定義之後、首次使用之前。omp_set_dynamic(0) 固定線程數。rand() 種子、臨時數組。threadprivate: 全局/靜態變量,跨並行區持久,線程隔離 private: 任意變量,僅當前並行區,每次進入未初始化 firstprivate: 任意變量,僅當前並行區,按主線程值初始化
threadprivate 是 OpenMP 實現線程局部存儲(TLS)的標準方式。理解其「全局聲明、線程隔離、跨區持久」三大特性,配合 private/firstprivate 靈活選擇,能高效解決並行區間的數據隔離與狀態傳遞問題。