代码:
#include <iostream>
#include "stdafx.h"
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
using namespace std;
boost::mutex mut;
double results[10];
void doubler(int x) {
//boost::mutex::scoped_lock lck(mut);
results[x] = x*2;
}
int _tmain(int argc, _TCHAR* argv[])
{
boost::thread_group thds;
for (int x = 10; x>0; x--) {
boost::thread *Thread = new boost::thread(&doubler, x);
thds.add_thread(Thread);
}
thds.join_all();
for (int x = 0; x<10; x++) {
cout << results[x] << endl;
}
return 0;
}
输出:
0 2 4 6 8 10 12 14 16 18 Press any key to continue . . .
所以...我的问题是为什么这个工作(据我所知,我运行了大约20次),产生上述输出,即使锁定被注释掉了? 我认为一般的想法是:
in each thread: calculate 2*x copy results to CPU register(s) store calculation in correct part of array copy results back to main(shared) memory
我认为在完全条件下,这将导致结果数组的某些部分具有0值。它只是将所需的数组复制到cpu寄存器吗?或者,在将结果写回ram之前,它是否会被计算得过于抢占?感谢。
答案 0 :(得分:3)
赋值在左侧有一个类型为double
的左值,而左值是线程访问的唯一对象。由于每个线程访问不同的对象,因此没有数据争用。
请注意,下载数组不构成访问。
答案 1 :(得分:1)
由于thds.join_all();
行而有效。主执行线程陷阱,直到所有其他线程完成,然后继续打印出阵列。因此,您知道在打印之前已存储了所有数组值。如果你注释掉这一行,你将得到不可预测的结果。