1

我有一个多线程 c++ 程序,它执行一些密集的持续计算。

我希望程序在计算进行时将进度写入 GUI/控制台。

为此,我让线程设置了一些有关其各自进度的数据,主线程定期检查这些数据以确定已完成的总计算量。

每个线程都被分配了一条单独的数据来写入(即 a 的元素std::vector),因此没有两条数据有多个线程写入它们。

然而,主线程也必须读取这些数据,因此并发性是一个问题。如果两个线程访问相同的数据,并且至少有一个是写入操作,则可能导致未定义行为的数据竞争。

目前我正在使用单个互斥锁来防止这种情况,但我担心这会不必要地减慢我的程序。

这让我想知道 - 并发使用的数据的值对程序逻辑并不重要 - 所以原则上我是否可以删除数据竞争保护(互斥锁) - 允许发生数据竞争 - 并简单地手动检查是否在对它们做任何事情之前,书面值是垃圾吗?还是存在的数据竞争的本质是否会导致更广泛的未定义行为,这可能会破坏我的问题?

还是有另一种更好的方法来做到这一点?在我的脑海中,另一个选择是原子向量,这样至少每个线程都有一个独特的并发保护,这样它们就不会相互影响,可以这么说。

4

0 回答 0