线程安全整数数组?

我遇到的情况是我有一个旧的多线程应用程序,我正在尝试移至linux平台并转换为C ++。

我有一个固定大小的整数数组:

int R [5000];

我执行很多操作,例如:

R [5] =(R [10] + R [20])/ 50;

R [5] ++;

我有一个前台任务,该任务主要读取值..但有时可以更新一个。然后我有一个后台工作人员正在不断更新这些值。

我需要使该结构线程安全。

如果值实际上已更改,我宁愿仅更新值。工作人员会不断收集数据并进行计算和存储,无论数据是否更改。

所以我应该创建一个自定义类MyInt,该类具有以下结构,然后包括一个互斥锁数组以锁定以更新/读取每个值,然后重载[],=,++,+ =,-=等吗?还是应该尝试实现解剖整数数组?

有什么建议吗?我想尝试保留上面的注释以进行更新...但是我知道这不可能。

谢谢, WB

likewindyaya 回答:线程安全整数数组?

要做的第一件事是使程序可靠地运行,而最简单的方法是使用一个互斥量来控制对整个阵列的访问。也就是说,只要任何一个线程需要读取或写入数组中的任何内容,它都应该执行以下操作:

the_mutex.lock();
// do all the array-reads,calculations,and array-writes it needs to do
the_mutex.unlock();

...然后测试您的程序,看它是否仍然运行得足够快以满足您的需求。如果是这样,那么您就完成了;这就是您需要做的所有事情。

如果您发现由于互斥锁上的争用而导致程序速度不够快,则可以开始尝试进行优化以加快处理速度。例如,如果您知道线程的操作一次只需要在数组的本地段上工作,则可以创建多个互斥锁,并将数组的不同子集分配给每个互斥锁(例如,互斥锁#1用于序列化对前100个数组项的访问,对后100个数组项的互斥体#2的访问,等等)。这样将大大减少一个线程必须等待另一个线程释放互斥才可以继续的可能性。

如果事情还不够快,那么您可以考虑使用两个不同的数组,每个线程一个,偶尔从一个数组复制到另一个。这样,每个线程都可以安全地访问自己的私有数组,而无需任何序列化。复制操作需要仔细处理,可能使用某种线程间消息传递协议。

本文链接:https://www.f2er.com/2337206.html

大家都在问