创建)一个boost ::线程用的boost ::绑定(或不(Creating a boost::t

2019-08-03 14:54发布

有些人似乎使用了boost :: bind()函数,如以下问题的答案接受发起的boost ::线程:

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

而其他人没有在这个问题的最upvotes的答案都一样使用它:

启动一个线程是一个C ++类的成员的最佳方式?

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

Answer 1:

正如你可以通过编译下面的代码中看到,并给出了预期的输出,提高::绑定是使用boost ::线程提供免费功能,成员函数和静态成员函数完全没有必要的:

#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 ::绑定外部不会导致它也翻倍,并在内部被称为它将经过原样。



Answer 2:

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



Answer 3:

boost::bind使用成员函数绑定到一个线程,而没有的boost ::绑定正常您使用的是静态函数或线程免费功能。



Answer 4:

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

主要的区别是你需要给线程函数中访问什么。

如果您的设计需要您访问一个类实例的数据,然后启动你的线程作为一个类的实例的部分(使用boost::bindthis带和成员函数或静态成员函数void*映射到this -这是一个风格问题居多)。

如果您的设计要求线程函数不依赖于特定对象的数据,然后使用一个免费的功能。



Answer 5:

主要的区别是你是否想接口的静态或者非静态成员函数。 如果你想使用非静态成员函数由线程推出的功能,必须使用类似bind

建议的替代(你链接的第二个问题)是使用需要一个指向类对象,然后可以调用任何它的成员的静态方法。 这将清除小幅上涨的语法,但最大的好处(对我来说)是你不需要有类似Boost获得bind 。 但是,如果你正在使用boost::threads你还不如采取boost::bind也。 注意,C ++ 11有std::bind ,所以你可以使用bindpthreads以及不引入任何额外的依赖,如升压,但这是,如果你想使用C ++ 11。

我看不出一个令人信服的语法理由,以避免使用bind在具有调用成员函数的静态方法。 但是,这是更个人喜好的问题。



文章来源: Creating a boost::thread with boost::bind() or without