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