线程安全整数数组?

Thread Safe Integer Array?

本文关键字:数组 整数 安全 线程      更新时间:2023-10-16

我有一个遗留的多线程应用程序,我正在尝试迁移到 Linux 平台并转换为 C++。

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

int R[5000];

我执行了很多操作,例如:

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

R[5]++;

我有一个前台任务,主要读取值。但有时可以更新一个。 然后我有一个后台工作线程不断更新值。

我需要使这个结构线程安全。

我宁愿只在值实际更改时才更新值。 工作人员不断收集数据并进行计算和存储数据,无论数据是否更改。

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

关于那会是什么样子的任何建议? 我想尝试保留上述符号以进行更新...但我明白这可能是不可能的。

谢谢 工 务 局

首先要做的是使程序可靠地工作,最简单的方法是使用一个互斥体来控制对整个数组的访问。 也就是说,每当任一线程需要读取或写入数组中的任何内容时,它都应该执行以下操作:

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

。然后测试您的程序,看看它是否仍然足够快地满足您的需求。 如果是这样,你就完成了;这就是你需要做的。

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

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