有些人似乎使用 boost::bind() 函数启动 boost::threads,就像在以下问题的公认答案中一样:
而其他人根本不使用它,例如在这个问题中获得最多支持的答案中:
那么,如果存在,有什么区别?
有些人似乎使用 boost::bind() 函数启动 boost::threads,就像在以下问题的公认答案中一样:
而其他人根本不使用它,例如在这个问题中获得最多支持的答案中:
那么,如果存在,有什么区别?
从下面的编译代码中可以看到,并给出了预期的输出,对于将 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 不会导致它也加倍并在内部调用,因为它会按原样通过。
没有区别 -thread
构造函数在bind
内部使用。人们bind
出于历史原因明确使用,因为 Boost.Thread 在 1.36 之前没有“绑定”构造函数。
用于将boost::bind
成员函数绑定到线程,而没有 boost::bind 通常您使用的是静态函数或线程的自由函数。
那么,如果存在,有什么区别?
主要区别在于您需要在线程函数中访问什么。
如果您的设计要求您访问类实例的数据,则将线程作为类实例的一部分启动(使用boost::bind
withthis
和成员函数,或具有void*
映射到的静态成员函数this
- 这主要是风格问题)。
如果您的设计要求线程函数不依赖于特定对象的数据,则使用自由函数。
主要区别在于您是要接口静态成员函数还是非静态成员函数。如果你想使用非静态成员函数作为线程启动的函数,你必须使用类似bind
.
建议的替代方法(您链接的第二个问题)是使用静态方法,该方法采用指向类对象的指针,然后可以调用它的任何成员。这稍微清除了语法,但最大的优势(对我而言)是您不需要包含诸如Boost
get之类的东西bind
。但如果你正在使用boost::threads
,你不妨也服用boost::bind
。请注意,C++ 11 具有std::bind
,因此您也可以使用bind
withpthreads
而不会引入任何额外的依赖项,例如 Boost,但前提是您想使用 C++ 11。
我没有看到一个令人信服的语法理由来避免bind
过度使用调用成员函数的静态方法。但这更多是个人喜好问题。