11

有些人似乎使用 boost::bind() 函数启动 boost::threads,就像在以下问题的公认答案中一样:

使用 boost 线程和非静态类函数

而其他人根本不使用它,例如在这个问题中获得最多支持的答案中:

作为 C++ 类的成员启动线程的最佳方式?

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

4

5 回答 5

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 不会导致它也加倍并在内部调用,因为它会按原样通过。

于 2012-12-06T11:39:16.860 回答
11

没有区别 -thread构造函数在bind内部使用。人们bind出于历史原因明确使用,因为 Boost.Thread 在 1.36 之前没有“绑定”构造函数

于 2012-12-06T12:42:38.297 回答
1

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

于 2012-12-06T11:32:20.530 回答
1

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

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

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

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

于 2012-12-06T12:28:49.597 回答
0

主要区别在于您是要接口静态成员函数还是非静态成员函数。如果你想使用非静态成员函数作为线程启动的函数,你必须使用类似bind.

建议的替代方法(您链接的第二个问题)是使用静态方法,该方法采用指向类对象的指针,然后可以调用它的任何成员。这稍微清除了语法,但最大的优势(对我而言)是您不需要包含诸如Boostget之类的东西bind。但如果你正在使用boost::threads,你不妨也服用boost::bind。请注意,C++ 11 具有std::bind,因此您也可以使用bindwithpthreads而不会引入任何额外的依赖项,例如 Boost,但前提是您想使用 C++ 11。

我没有看到一个令人信服的语法理由来避免bind过度使用调用成员函数的静态方法。但这更多是个人喜好问题。

于 2012-12-06T11:32:37.183 回答