请看下面的snipet:
struct Event
{
void event1( time_t t );
void event2( int, int );
}
Event* f = ...;
time_t t; int i1, int i2;
// 1st
std::thread t{ std::bind( &Event::event1, f, std::placeholders::_1 ), t };
std::thread t{ std::bind( &Event::event2, f, std::placeholders::_1, std::placeholders::_2 ), i1, i2 };
// 2nd method
std::thread t{ &Event::event1, f, t };
std::thread t{ &Event::event2, f, i1, i2 };
第一种和第二种方法的区别。哪种方法更好?
答案 0 :(得分:2)
第一种方法使用Event
围绕函数,std::bind
实例及其各自的参数创建一个调用包装器。然后它将这些调用包装器传递给线程对象。
第二种方法将函数Event
实例和参数直接传递给线程对象。
两种方法的结果都是一样的,虽然第一种方法对我来说似乎是不必要的一步。
当您需要传递包装而不是单个参数时,请使用std::bind
,例如:
auto func = std::bind(&Event::event1, f, std::placeholders::_1);
functionTakingCallable(func);
functionTakingCallable2(func);
std::thread t(func, arg);