C++ 将类方法绑定到线程

C++ 将类方法绑定到线程,c++,multithreading,c++11,bind,C++,Multithreading,C++11,Bind,请看下面的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( &

请看下面的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 };

这就是第一种方法和第二种方法的区别。哪种方法更好?

第一种方法使用
std::bind
围绕函数、它们的
事件
实例及其各自的参数创建调用包装器。然后它将这些调用包装器传递给线程对象

第二种方法将函数、
Event
实例和参数直接传递给线程对象

两种方法的结果是相同的,尽管第一种方法对我来说似乎执行了一个不必要的步骤

当需要传递包装而不是单个参数时,请使用
std::bind
,例如:

auto func = std::bind(&Event::event1, f, std::placeholders::_1);

functionTakingCallable(func);
functionTakingCallable2(func);
std::thread t(func, arg);

std::bind
在这里不需要,有关讨论,请参阅我链接的问题中的答案。