环境:
gcc (GCC) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
测试代码:
#include <stdio.h>
#include <omp.h>
#define ARRAY_SIZE 6
int main() {
int i = -100;
int k = -200;
#pragma omp parallel for num_threads(2)
for (i = 0; i < ARRAY_SIZE; i++) {
// 获取当前线程号
int thread_id = omp_get_thread_num();
// 打印变量的值
printf("Thread %d: i = %d\n", thread_id, i);
// 在并行区域内打印变量地址
printf("Thread %d: Address of i = %p\n", thread_id, &i);
}
printf("\n Master i = %d\n\n", i);
#pragma omp parallel for num_threads(2)
for (int k = 0; k < ARRAY_SIZE; k++) {
// 获取当前线程号
int thread_id = omp_get_thread_num();
// 打印变量的值
printf("Thread %d: k = %d\n", thread_id, k);
// 在并行区域内打印变量地址
printf("Thread %d: Address of k = %p\n", thread_id, &k);
}
printf("\n Master k = %d\n\n", k);
return 0;
}
运行结果:
Thread 0: i = 0
Thread 0: Address of i = 0xffffce322428
Thread 0: i = 1
Thread 0: Address of i = 0xffffce322428
Thread 0: i = 2
Thread 0: Address of i = 0xffffce322428
Thread 1: i = 3
Thread 1: Address of i = 0x40003a3a68f8
Thread 1: i = 4
Thread 1: Address of i = 0x40003a3a68f8
Thread 1: i = 5
Thread 1: Address of i = 0x40003a3a68f8
Master i = -100
Thread 1: k = 3
Thread 1: Address of k = 0x40003a3a68f8
Thread 1: k = 4
Thread 1: Address of k = 0x40003a3a68f8
Thread 1: k = 5
Thread 1: Address of k = 0x40003a3a68f8
Thread 0: k = 0
Thread 0: Address of k = 0xffffce322428
Thread 0: k = 1
Thread 0: Address of k = 0xffffce322428
Thread 0: k = 2
Thread 0: Address of k = 0xffffce322428
Master k = -200
测试结论:
- #pragma omp parallel for,第一个循环中的循环变量是私有的,无论i是在for外声明还是在for内声明。多线程编程肯定要注意变量地址,在各个线程是共享还是独立的。
- 该文章结论不太准确https://blog.csdn.net/qq_34488063/article/details/53177078