我的多线程程序中有一个块,它执行以下操作:
void func(args){
do computation;
for(i = 0; i < n ; i++)
value[i] += computed_value;
}
多线程将执行此功能。所以我需要使用锁使程序线程安全。锁定使程序比单线程程序慢。我试过使用锁,但它使程序非常慢。还请提出一些替代方法。
答案 0 :(得分:1)
根据您的代码,您没有任何锁定。我使用锁而不是锁作为我开始的方法。 (没有更多的澄清,我真的无法帮助那么多)。如果可以的话,只需锁定计算中的操作即可。
Psuedo示例
int computation(int i)
lock();
i = i + 1;
unlock();
return i;
答案 1 :(得分:0)
这个问题很普遍,所以这里有一些一般性的回答:
底线是你不能让多个线程同时读/写同一块内存。锁定阅读和写入有问题的内存是一种方法。那可以是你自己的锁,也可以使用原子+ =函数(如果有的话)。
我可以想到另外两种常用的替代方案:
1)让每个线程负责阵列的一个单独部分。因此,例如,如果您的数组中有4个线程和20个元素,则线程1可以在元素0-4上操作,线程2可以在元素5-9上操作,依此类推。
2)为每个线程分别创建一个数组副本,然后将数组的副本组合成一个最终数组。因此,例如,如果您的数组中有4个线程和20个元素,则线程1将在副本1上运行,第2个线程在副本2上运行,依此类推。完成后,您必须将4个阵列合并为1个。
显然第二个想法需要更多的内存,但我们对你的问题的参数知之甚少,所以这些只是一些一般的想法。