使用boost :: bind()或不使用boost :: bind创建boost :: thread

时间:2012-12-06 11:26:50

标签: c++ boost boost-thread

有些人似乎使用boost :: bind()函数启动boost :: threads,就像下面问题的接受答案一样:

Using boost thread and a non-static class function

而其他人完全没有使用它,就像这个问题中最赞成的答案一样:

Best way to start a thread as a member of a C++ class?

那么,有什么区别,如果它存在?

5 个答案:

答案 0 :(得分:13)

正如您在下面的代码中看到的那样编译并给出了预期的输出,对于使用带有自由函数,成员函数和静态成员函数的boost :: thread来说,完全不需要boost :: bind:

#include <boost/thread/thread.hpp>
#include <iostream>

void FreeFunction()
{
  std::cout << "hello from free function" << std::endl;
}

struct SomeClass
{
  void MemberFunction()
  {
    std::cout << "hello from member function" << std::endl;
  }

  static void StaticFunction()
  {
    std::cout << "hello from static member function" << std::endl;
  }
};

int main()
{
  SomeClass someClass;

  // this free function will be used internally as is
  boost::thread t1(&FreeFunction);
  t1.join();

  // this static member function will be used internally as is
  boost::thread t2(&SomeClass::StaticFunction);
  t2.join();

  // boost::bind will be called on this member function internally
  boost::thread t3(&SomeClass::MemberFunction, someClass);
  t3.join();
}

输出:

hello from free function
hello from static member function
hello from member function

构造函数中的内部绑定可以为您完成所有工作。

对每种功能类型的内容添加了一些额外的评论。 (希望我已正确阅读了源代码!)据我所知,外部使用boost :: bind不会导致它加倍并在内部调用,因为它将按原样传递。

答案 1 :(得分:10)

没有区别 - thread构造函数在内部使用bind。 由于历史原因,人们明确使用bind,因为Boost.Thread没有"binding" constructor before 1.36

答案 2 :(得分:1)

boost::bind用于将成员函数绑定到线程,而没有boost :: bind,通常使用静态函数或自由函数与线程。

答案 3 :(得分:1)

  

那么,有什么区别,如果它存在?

主要区别在于你需要在线程函数中访问什么。

如果您的设计要求您访问类实例的数据,那么将线程作为类实例的一部分启动(使用带有boost::bind的{​​{1}}和成员函数,或带有静态成员函数的this映射到void* - 这主要是风格问题。

如果您的设计要求线程函数不依赖于特定对象的数据,则使用自由函数。

答案 4 :(得分:0)

主要区别在于您是要连接静态成员函数还是非静态成员函数。如果要将非静态成员函数用作线程启动的函数,则必须使用bind之类的函数。

建议的替代方法(你链接的第二个问题)是使用一个静态方法,它接受一个指向类对象的指针,然后可以调用它的任何成员。这会轻微地清除语法,但对我来说最大的好处是你不需要包含Boost之类的内容来获取bind。但是,如果您使用的是boost::threads,您也可以使用boost::bind。注意,C ++ 11有std::bind因此您可以将bindpthreads一起使用,并且不会引入任何额外的依赖项,例如Boost,但是如果您想使用C ++ 11那就是。

我没有看到令人信服的语法原因,避免使用bind而不是使用调用成员函数的静态方法。但这更多的是个人偏好。