Openmp for 循环变量私有还是共享 | “关于for循环有几个大坑需要注意”

环境:

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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值