【问题标题】:Executing a member function of a class执行类的成员函数
【发布时间】:2013-03-01 02:54:10
【问题描述】:

我正在尝试以一种方式试验 C++11 线程,它接受一个类的成员函数作为线程构造函数的参数,如下面第 20 行的第一个代码 sn-p 所示,标记为 .类定义在第二个代码 sn-p 中给出。编译此代码时,我收到了第三个 sn-p 中显示的一堆错误。谁能告诉我我做错了什么?谢谢。

SNIPPET 1:线程初始化 (main_app.cpp)

#include <thread>
#include "ServiceRegistrar.hpp"

#define SERVER_TYPE  100065
#define SERVER_INST_LOWER  1
#define SERVER_INST_UPPER  2
#define TIMEOUT  500000

int main()
{
  ServiceRegistrar sr1(SERVER_TYPE, TIMEOUT, SERVER_INST_LOWER, SERVER_INST_LOWER);
      /*LINE 20 is the following*/
  std::thread t(&ServiceRegistrar::subscribe2TopologyServer, sr1);
t.join();
  sr1.publishForSRs();

}

SNIPPET 2:类定义

class ServiceRegistrar
{
  public:
    ServiceRegistrar(int serverType, int serverTimeOut, int serverInstanceLower, int serverInstanceUpper)
       : mServerType(serverType),
         mServerTimeOut(serverTimeOut),
         mServerInstanceLower(serverInstanceLower),
         mServerInstanceUpper(serverInstanceUpper)
         { }

     void subscribe2TopologyServer();
     void publishForSRs();
     void publishForServices();

  private:
     int mServerType;
     int mServerTimeOut;
     int mServerInstanceLower;
         int mServerInstanceUpper;           
  };

SNIPPET 3:编译输出

  $ g++ -g -c -Wall -std=c++11 main_app.cpp -pthread
  In file included from /usr/include/c++/4.7/ratio:38:0,
             from /usr/include/c++/4.7/chrono:38,
             from /usr/include/c++/4.7/thread:38,
             from main_app.cpp:8:
  /usr/include/c++/4.7/type_traits: In instantiation of ‘struct    std::_Result_of_impl<false, false, std::_Mem_fn<void (ServiceRegistrar::*)()>,    ServiceRegistrar>’:
  /usr/include/c++/4.7/type_traits:1857:12:   required from ‘class std::result_of<std::_Mem_fn<void (ServiceRegistrar::*)()>(ServiceRegistrar)>’
  /usr/include/c++/4.7/functional:1563:61:   required from ‘struct std::_Bind_simple<std::_Mem_fn<void (ServiceRegistrar::*)()>(ServiceRegistrar)>’
 /usr/include/c++/4.7/thread:133:9:   required from ‘std::thread::thread(_Callable&&,  _Args&& ...) [with _Callable = void (ServiceRegistrar::*)(); _Args = {ServiceRegistrar&}]’
 main_app.cpp:20:64:   required from here
/usr/include/c++/4.7/type_traits:1834:9: error: no match for call to     ‘ (std::_Mem_fn<void (ServiceRegistrar::*)()>) (ServiceRegistrar)’

【问题讨论】:

  • ewwww 非常不必要的宏。

标签: c++ multithreading c++11 stdthread


【解决方案1】:

显然是gcc 4.7 bug...使用

std::thread t(&ServiceRegistrar::subscribe2TopologyServer, &sr1);

改为。

编辑:实际上,您可能不想将sr1 复制到t 的线程本地存储中,所以无论如何这更好。

【讨论】:

  • Bug 与否,你几乎肯定想在这里绑定一个指针或引用。
  • @MikeSeymour 是的,刚刚添加了
【解决方案2】:

试试:

std::thread t(std::bind(&ServiceRegistrar::subscribe2TopologyServer, sr1));

希望对你有帮助。

【讨论】:

  • 这掩盖了问题,因为bindthread 没有相同的错误。但是绑定到sr1 的副本几乎肯定是错误的做法。
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2020-12-04
  • 2011-12-30
  • 2011-04-06
  • 2014-11-22
相关资源
最近更新 更多