我的多线程程序中有一个块,它执行以下操作:
void func(args){
do computation;
for(i = 0; i < n ; i++)
value[i] += computed_value;
}
多个线程将执行此函数。所以我需要使用锁使程序线程安全。锁定使程序比单线程程序慢。我曾尝试使用锁,但它使程序非常慢。还请提出一些替代方法。
我的多线程程序中有一个块,它执行以下操作:
void func(args){
do computation;
for(i = 0; i < n ; i++)
value[i] += computed_value;
}
多个线程将执行此函数。所以我需要使用锁使程序线程安全。锁定使程序比单线程程序慢。我曾尝试使用锁,但它使程序非常慢。还请提出一些替代方法。
根据您的代码,您没有任何锁。我会使用锁而不是没有锁作为我的方法的开始。(没有更多的澄清,我真的帮不了那么多)。如果可以,只需将操作锁定在计算中。
伪示例
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 个。
显然第二个想法需要更多的内存,但我们对你的问题的参数了解不多,所以这些只是一些一般的想法。