有些人似乎使用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?
那么,有什么区别,如果它存在?
答案 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
因此您可以将bind
与pthreads
一起使用,并且不会引入任何额外的依赖项,例如Boost,但是如果您想使用C ++ 11那就是。
我没有看到令人信服的语法原因,避免使用bind
而不是使用调用成员函数的静态方法。但这更多的是个人偏好。