有些人似乎使用了boost :: bind()函数,如以下问题的答案接受发起的boost ::线程:
使用boost线程和非静态类函数
而其他人没有在这个问题的最upvotes的答案都一样使用它:
启动一个线程是一个C ++类的成员的最佳方式?
那么,有什么区别,如果它的存在?
有些人似乎使用了boost :: bind()函数,如以下问题的答案接受发起的boost ::线程:
使用boost线程和非静态类函数
而其他人没有在这个问题的最upvotes的答案都一样使用它:
启动一个线程是一个C ++类的成员的最佳方式?
那么,有什么区别,如果它的存在?
正如你可以通过编译下面的代码中看到,并给出了预期的输出,提高::绑定是使用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 ::绑定外部不会导致它也翻倍,并在内部被称为它将经过原样。
没有区别- thread
构造器使用bind
在内部。 人们使用bind
明确由于历史的原因,因为Boost.Thread没有一个1.36之前“绑定”的构造 。
该boost::bind
使用成员函数绑定到一个线程,而没有的boost ::绑定正常您使用的是静态函数或线程免费功能。
那么,有什么区别,如果它的存在?
主要的区别是你需要给线程函数中访问什么。
如果您的设计需要您访问一个类实例的数据,然后启动你的线程作为一个类的实例的部分(使用boost::bind
与this
带和成员函数或静态成员函数void*
映射到this
-这是一个风格问题居多)。
如果您的设计要求线程函数不依赖于特定对象的数据,然后使用一个免费的功能。
主要的区别是你是否想接口的静态或者非静态成员函数。 如果你想使用非静态成员函数由线程推出的功能,必须使用类似bind
。
建议的替代(你链接的第二个问题)是使用需要一个指向类对象,然后可以调用任何它的成员的静态方法。 这将清除小幅上涨的语法,但最大的好处(对我来说)是你不需要有类似Boost
获得bind
。 但是,如果你正在使用boost::threads
你还不如采取boost::bind
也。 注意,C ++ 11有std::bind
,所以你可以使用bind
与pthreads
以及不引入任何额外的依赖,如升压,但这是,如果你想使用C ++ 11。
我看不出一个令人信服的语法理由,以避免使用bind
在具有调用成员函数的静态方法。 但是,这是更个人喜好的问题。