我有一个多线程 c++ 程序,它执行一些密集的持续计算。
我希望程序在计算进行时将进度写入 GUI/控制台。
为此,我让线程设置了一些有关其各自进度的数据,主线程定期检查这些数据以确定已完成的总计算量。
每个线程都被分配了一条单独的数据来写入(即 a 的元素std::vector
),因此没有两条数据有多个线程写入它们。
然而,主线程也必须读取这些数据,因此并发性是一个问题。如果两个线程访问相同的数据,并且至少有一个是写入操作,则可能导致未定义行为的数据竞争。
目前我正在使用单个互斥锁来防止这种情况,但我担心这会不必要地减慢我的程序。
这让我想知道 - 并发使用的数据的值对程序逻辑并不重要 - 所以原则上我是否可以删除数据竞争保护(互斥锁) - 允许发生数据竞争 - 并简单地手动检查是否在对它们做任何事情之前,书面值是垃圾吗?还是存在的数据竞争的本质是否会导致更广泛的未定义行为,这可能会破坏我的问题?
还是有另一种更好的方法来做到这一点?在我的脑海中,另一个选择是原子向量,这样至少每个线程都有一个独特的并发保护,这样它们就不会相互影响,可以这么说。