使用具有唯一指针的 std::thread 的 class 成员函数时出现编译错误

Compilation error while using class member function for std::thread with unique pointer

我是C++新手,我需要使用class对象的成员函数作为线程函数,对象在应用程序中使用class并且对象不能共享所以它是一个独特的指针。当我尝试创建线程时,出现编译错误。

我无法按原样复制代码,所以只创建了一个示例代码片段。

DerivedType<-Base3Type<-Base2Type<-Base1Type - DerivedType 在应用程序 class[= 中声明为私有19=]

class AppClass
{
private:
    std::unique_ptr<DerivedType> transport;
public:

}

AppClass::Open()
{

    transport= std::make_unique<DerivedType>(client, logger);

    std::thread receive(&DerivedType::receive, &transport, flag, 1000);//flag and 100 are arguments to DerivedType::receive function.
}

我收到以下编译错误

/usr/include/c++/5.2.1/functional:634:20: **error: pointer to member type ‘void (Base1Type::Base2Type::Base3Type::DerivedType::)(std::shared_ptr<bool>, const short unsigned int&)’ incompatible with object type ‘std::unique_ptr<Base1Type::Base2Type::Base3Type::DerivedType>’**
  { return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); }
                    ^

/usr/include/c++/5.2.1/functional:634:60: **error: return-statement with a value, in function returning 'void' [-fpermissive]**
  { return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); }

请告诉我如何在不崩溃的情况下编译和执行它。谢谢。

你想调用成员函数作为线程的主体,所以你需要传递指向 DerivedType 对象的指针(使用 unique_ptr::get 方法),而不是指向 unique_ptr 的指针,write

std::thread receive(&DerivedType::receive, transport.get(), flag, 1000);//
                                           ^^^^^^^^^^^^^^^

and execute without crash.

现在,在 Open 方法末尾调用线程的析构函数时,您的代码将被 terminate 函数中止,因为您的 thread 处于可连接状态。所以你需要选择

  1. receive 线程对象上调用 join,然后在 Open 方法中等待(没有意义)
  2. receive 对象上调用 detach,但是你必须确保 transport 对象不会在 receive 线程结束时开始任务之前被销毁。