在多线程环境中将数据写入数组

data write in array in multi-threading environment

本文关键字:数组 数据 多线程 环境      更新时间:2023-10-16

我的多线程程序中有一个块,它执行以下操作:

void func(args){
    do computation;
    for(i = 0; i < n ; i++)
        value[i] += computed_value;
 }

多线程将执行此函数。 所以我需要使用 lock 使程序线程安全。 锁定使程序比单线程程序慢。 我尝试使用锁,但它使程序非常慢。 还请提出一些替代方法。

根据您的代码,您没有任何锁。 我会使用锁而不是没有锁作为我的方法的开始。 (没有更多的澄清,我真的帮不上那么多忙(。 如果可以,只需将操作锁定在计算中即可。

伪装示例

int computation(int i)
    lock();
    i = i + 1;
    unlock();
    return i;

这个问题很笼统,所以这里有一些一般的想法作为回应:

底线是你不能让多个线程同时读/写同一块内存。 锁定相关内存的读取和写入是一种方法。 那要么使用您自己的锁,要么使用原子 += 函数(如果您可用(。

我能想到的另外两种通用选择:

1( 让每个线程负责数组的单独部分。 例如,如果您的数组中有 4 个线程和 20 个元素,则线程 1 可以对元素 0-4 进行操作,线程 2 可以对元素 5-9 进行操作,依此类推。

2( 为每个线程创建一个单独的数组副本,然后将数组的副本合并到一个最终数组中。 例如,如果您的数组中有 4 个线程和 20 个元素,则线程 1 将在副本 1 上运行,线程 2 将在副本 2 上运行,依此类推。 完成后,您必须将 4 个数组合并为 1。

显然,第二个想法需要更多的内存,但我们对问题的参数知之甚少,所以这些只是一些一般的想法。