我有一个用C ++编码的迭代过程需要很长时间,我正在考虑将我的代码转换为使用多个线程。但我担心它可能非常复杂并且存在锁定和错误的风险。但是我怀疑对于这个特殊的问题,它可能是微不足道的,但我想要确认。
我希望我可以使用这个简单的线程代码here。
我的程序使用了大量的全局数组和结构。我假设如果其他线程试图同时读取相同的数据,那么各个线程就不必关心它们。
我还假设如果一个线程想要通过1.5增加一个全局浮点变量而另一个线程想要减去0.1,那么只要我不关心事件的顺序那么两个线程就会在没有任何特殊代码(如互斥锁和锁等)的情况下成功完成任务,浮点数最终会增加1.4。如果我的所有假设都是正确的那么我的任务将很容易 - 请告知。
编辑:只是为了使其绝对清晰 - 浮点数递增/递减的顺序并不重要。只要它的价值最终增加1.4,那么我很高兴。在所有线程完成任务之前,float的值不是 read 。
编辑:作为一个更具体的例子,成像我们的任务是找到来自美国不同州的慈善机构的捐款总额。我们可以拥有这样的全球:
float total_donations= 0;
然后我们可以有50个单独的线程,每个线程计算一个名为donations_from_this_state的本地浮点数。并且每个线程将分别执行:
total_donations += donations_from_this_state;
显然,线程执行任务的顺序对最终结果没有影响。
答案 0 :(得分:5)
我假设如果其他线程试图同时读取相同的数据,则各个线程不需要关注它们。
正确。只要所有线程都是读取器,就不需要同步,因为共享数据中没有更改任何值。
我还假设如果一个线程想要通过1.5增加一个全局浮点变量而另一个线程想要减去0.1,那么只要我不关心事件的顺序那么两个线程就会在没有任何特殊代码(如互斥锁和锁等)的情况下成功完成任务,浮动最终会变大1.4(
这个假设是不正确的。如果有两个或多个线程写入同一个共享变量并且该变量未在内部同步,那么您需要外部同步,否则您的代码每个[intro.multithread] / 21
都有未定义的行为程序的执行包含数据竞争,如果它在不同的线程中包含两个冲突的动作,其中至少有一个不是原子的,并且都不会在另一个之前发生。任何此类数据竞争都会导致未定义的行为。
[intro.multithread] / 4
指定冲突行动的地方如果其中一个修改内存位置(1.7)而另一个访问或修改相同的内存位置,则两个表达式评估会发生冲突。