线程安全整数数组?
Thread Safe Integer Array?
我有一个遗留的多线程应用程序,我正在尝试迁移到 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 个数组项, 等(。 这将大大降低一个线程必须等待另一个线程释放互斥锁才能继续的可能性。
如果事情对你来说仍然不够快,那么你可以考虑使用两个不同的数组,每个线程一个,偶尔从一个数组复制到另一个数组。 这样,每个线程都可以安全地访问自己的专用数组,而无需任何序列化。 复制操作需要小心处理,可能使用某种线程间消息传递协议。
- C++使用整数的压缩数组初始化对象
- 在一定长度后从数组中打印时缺少整数
- 是否基于数组B整数打印数组A中的整数
- 检查TCHAR数组输入是否为带符号整数C++
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 从二进制文件中读取整数数组
- 整数区间(或 int 数组)中每个数字的出现次数
- 新的整数数组向右移动?
- C++ 中的二维整数数组,每行中的元素数量不均匀
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- C++数组输入不接受一定数量的整数
- 从两个 4x64 位整数数组中获取取模
- 如何计算数组整数的总可能组合
- 2D 字符串数组 C++:整数串联成字符串
- 将数组整数2除以偶数和
- 将2d数组整数数据从c++发送到qml