код:
#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? Спасибо.