2015-04-20 2 views
1

В C++ 11 я хочу создать объекты классов Foo и Alpha (foo и alpha соответственно). Затем я хочу создать поток, который вызывает функцию alpha, передавая foo в качестве аргумента. Пока этот поток работает, я тогда хочу иметь возможность изменять foo.C++ 11 Многопоточность с общим объектом

Вот мой код до сих пор:

#include <thread> 
#include <iostream> 

class Foo 
{ 
public: 
    int x; 
    void Bar() 
    { 
     std::cout << x << std::endl; 
    } 
}; 

class Alpha 
{ 
public: 
    void Beta(Foo& foo) 
    { 
     while (true) 
     { 
      foo.Bar(); 
     } 
    } 
}; 

int main() 
{ 
    Foo foo; 
    foo.x = 5; 
    Alpha alpha; 
    std::thread beta_thread(&Alpha::Beta, alpha, foo); 
    beta_thread.join(); 

    while (true) 
    { 
     foo.x++; 
    } 

    return 0; 
} 

Однако, это дает мне ошибку компиляции:

/usr/include/c++/4.8/functional:1697: error: no type named 'type' in 'class std::result_of<std::_Mem_fn<void (Alpha::*)(Foo&)>(Alpha, Foo)>' 
     typedef typename result_of<_Callable(_Args...)>::type result_type; 
                  ^

Если я прохожу foo по значению, а не ссылки (void Beta(Foo foo)), то он компилирует нормально , Тем не менее, я считаю, что мне нужно пройти по ссылке, чтобы при изменении foo в основном цикле он изменит тот же экземпляр, который я передал Beta.

Любая помощь?

+0

Пожалуйста, прекратите рыбалку шаг за шагом, чтобы получить ответы и получить информацию. –

ответ

3

Когда вы передаете объекты в конструктор thread, они берутся по значению. Если вы хотите передать что-то по ссылке, вы должны сказать std::ref(foo).

Причина, по которой значение по умолчанию заключается в том, чтобы принимать аргументы по значению вместо, скажем, совершенной пересылки, связано с тем, что время жизни потока часто не ограничивается областью, а дизайнеры не хотят делать это настолько легко, что случайно создавать оборванные ссылки, когда в качестве аргументов используются локальные объекты.

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