2013-07-25 2 views
2
void ThreadFn(int& i) 
{ 
    cout<<"Hi from thread "<<i<<endl; 
} 
int x = 0; 
void CreateThreads(vector<thread>& workers) 
{ 
    for(int i = 0; i< 10; i++) 
    { 
     workers.push_back(thread(&ThreadFn, x)); 
    } 
} 

Я ожидал, что ошибка компиляции в создании потоков (workers.push_back(thread(&ThreadFn, x));) с x должен быть принят исх. я, хотя правильный синтаксис должен был:Passing ссылкой на StD :: нить C++ 0x в VS2012

workers.push_back(thread(&ThreadFn, std::ref(x))); 

Конечно, код компилируется нормально, а также ведет себя правильно. Я использую VC11. Любая идея, почему это не помечено?

ответ

3

Это VC11 ошибка, то thread объект делает внутренние копии аргументов (как это должно быть), но тогда он не направляет их функции ThreadFn правильно, так что происходит, ссылка связывается с thread объекта, внутренний int участник.

std::thread ССЗ используется, чтобы иметь подобную ошибку, потому что мы использовали std::bind реализовать его, но я заменил использование std::bind с другой деталью реализации, которая направляет захваченные аргументы функции по значению.

Смежные вопросы