c++ - 绑定(bind)类方法到线程

标签 c++ multithreading c++11 bind

看下面的片段:

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 实例和它们各自的参数周围创建一个调用包装器。然后它将这些调用包装器传递给线程对象。

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

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

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

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

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

关于c++ - 绑定(bind)类方法到线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791085/

相关文章:

linux - 使用 mmap() 在进程之间共享 std::map

c# - 无法在列表中将类型 'uint' 隐式转换为 'T'(来自类模板)

java - 无法创建新的 native 线程

c# - 异步和等待,有点困惑

c++ - 我怎样才能让事情发生 x 百分比?

c++ - bool lambda?

c++ - 如何为服务器编写主循环?

c++ - 通过外部 "C"函数与 C++ 对象的接口(interface)

c++ - 适当的全屏调整窗口和 linux C++

java - 我不明白这个 ThreadPoolExecutor 行为