0

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

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

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

4

2 回答 2

1

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

伪示例

int computation(int i)
    lock();
    i = i + 1;
    unlock();
    return i;
于 2013-09-24T17:27:37.533 回答
0

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

底线是你不能让多个线程同时读/写同一块内存。对有问题的内存的读取和写入加锁是一种方法。那可以是使用您自己的锁,也可以使用原子 += 函数(如果您可以使用的话)。

我能想到的还有另外两种通用的替代方案:

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

2)为每个线程拥有一个单独的数组副本,然后将数组的副本组合成一个最终数组。例如,如果您有 4 个线程,数组中有 20 个元素,则线程 1 将对副本 1 进行操作,线程 2 将对副本 2 进行操作,依此类推。完成后,您必须将 4 个数组合并为 1 个。

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

于 2013-09-24T20:51:00.130 回答