Создание экземпляра потока cpp11 с помощью метода класса, который содержит мьютекс - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь использовать мьютекс для синхронизации выполнения нескольких методов в разных потоках. Я создаю класс Bar, который содержит метод foo и атрибут mutex. Затем я хочу запустить этот метод foo в потоке. Я не понимаю, почему это проблема, и следующий код не компилируется? И как это исправить? Любая помощь приветствуется.

#include <thread>
#include <mutex>

class Bar
{
public:
  Bar (){};
  void foo(){};
  std::mutex m_;
};

int main(void)
{
  Bar b;
  std::thread t(&Bar::foo, b);
  return 0;
}

Я получаю следующие ошибки:

include/c++/7.3.0/thread:256:11: error: no matching constructor for initialization of '__decayed_tuple<void (Bar::*)(), Bar &>'                  (aka 'std::tuple<void (Bar::*)(), Bar>')                                                                                                                                                             
 return { __decayed_tuple<_Callable, _Args...>{ 

и

include/c++/7.3.0/tuple:133:4: error: call to implicitly-deleted copy constructor of 'Bar'
        : _M_head_impl(std::forward<_UHead>(__h)) { }

1 Ответ

0 голосов
/ 01 сентября 2018

Вы должны передавать указатель на b, а не на b:

std::thread t(&Bar::foo, &b);

Как и в вашем коде, вы пытаетесь передать по значению, которое включает в себя копирование - а мьютекс не имеет конструктора копирования, только конструктор перемещения.

...