gpt4 book ai didi

c++ - 多线程函数可以使用静态数组在线程之间共享数据吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:20:20 29 4
gpt4 key购买 nike

假设您有一个函数可以计算一个值在一个大数组中出现的次数。您希望通过让每个线程计算其自己的数组部分中出现的次数,然后将结果加在一起来实现此函数的多线程化。我们可以假设每个线程都有一个唯一的等级(从 0 到 N-1),并且每个线程将在大约同一时间调用该函数。例如:

int count[N];  // global array

int countOccurences()
{
count[rank] = /* count occurences in one part of the array */
// wait until all other threads reached this point
int total = 0;
for (int i=0; i<N; i++)
total += count[i];
return total;
}

问题是,在上面的示例中,我可以将 count 数组作为静态变量移动到 countOccurences() 的主体中吗?我不需要它存在于函数体之外的任何地方:静态数组会在线程之间共享吗?

最佳答案

您的问题的答案是肯定的,线程可以访问同一编译单元中的全局数据和静态数据,但是关于“在线程之间共享数据”这个主题还有更多内容需要理解。

对于每个线程,都有一个线程将与其他线程并行执行的相应函数(“线程函数”)。线程可以访问该函数可以访问的任何内容,通过指针或引用参数、全局数据、与线程函数位于同一编译单元中的静态数据,或者可通过其他函数读取/修改的全局和/或静态数据线程函数可以调用。您应该能够确定给定函数可以读取或修改的每个内存区域。给定线程函数的那些内存区域正是该线程有权访问的内存区域。

很容易看出,同一个编译单元中的全局数据和静态数据对于一个线程函数是可以访问的,所以你的问题的答案是"is"。

您可能想要研究的一件事是 OpenMP,它具有用于并行化 countOccurrences 操作(所谓的“减少”)的内置结构:

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

size_t countOccurrences(const int *arr, size_t n, int which) {
size_t count, i;

count = 0;

#pragma omp parallel for reduction(+:count)
for (i = 0; i < n; ++i) {
if (arr[i] == which)
++count;
}

return count;
}

int main()
{
int arr[] = { 3, 5, -1, -1, 0 };

size_t count = countOccurrences(arr, sizeof (arr)/sizeof (arr[0]), -1);
printf("count = %d\n", (int) count);
return EXIT_SUCCESS;
}

关于c++ - 多线程函数可以使用静态数组在线程之间共享数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4979137/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com