bind
无敌清风蓝发表于 2023/06/13 13:55:20
13600
【摘要】 bind
1.介绍
std::bind
是一个函数模板,它可以将一个函数或函数对象与其参数绑定在一起,生成一个新的可调用对象。这个新的可调用对象可以使用固定的参数值或占位符来调用原始函数。
2.例子
下面是一个简单的例子,演示了如何使用 std::bind
来绑定成员函数:
#include <iostream> #include <functional> struct Foo { void print(int x) { std::cout << x << '\n'; } }; int main() { Foo foo; auto f = std::bind(&Foo::print, &foo, std::placeholders::_1); f(42); // 调用 foo.print(42) return 0; }
在这个例子中,我们使用 std::bind
将成员函数 Foo::print
与对象 &foo
绑定在一起,并使用占位符 _1
表示第一个参数。然后,我们调用新生成的可调用对象 f
,并传入参数 42
。这相当于调用 foo.print(42)
thread produce(std::bind(&ConnectionPool::produceConnectionTask, this));这行代码将来怎么调用呢
这行代码创建了一个名为 produce
的 std::thread
对象。它使用 std::bind
将成员函数 ConnectionPool::produceConnectionTask
与对象 this
绑定在一起,生成一个新的可调用对象。然后,将这个可调用对象传递给 std::thread
构造函数,以在线程中调用 this->produceConnectionTask()
。
当这行代码执行完毕后,新创建的线程就会开始执行。它会调用 this->produceConnectionTask()
函数,并在函数执行完毕后退出。
如果需要等待线程执行完毕,可以调用 produce.join()
函数。这个函数会阻塞当前线程,直到 produce
线程执行完毕。
例如:
thread produce(std::bind(&ConnectionPool::produceConnectionTask, this)); // 等待线程执行完毕 produce.join();
在上面的代码中,我们首先创建了一个名为 produce
的线程对象。然后,调用它的 join
函数等待线程执行完毕。
不过经常看到join,那为什么要join呢
在多线程编程中,通常会创建多个线程来并行执行不同的任务。这样可以提高程序的执行效率,充分利用多核处理器的计算能力。
在某些情况下,主线程需要等待其他线程执行完毕后再继续执行。例如,主线程可能需要等待其他线程完成计算后才能汇总结果。这时,可以使用 std::thread
类的 join
函数来等待线程执行完毕。
当然,也可以不使用 join
函数,而是让主线程一直等待,直到其他线程执行完毕。但是这样做会浪费主线程的计算资源,降低程序的执行效率。使用 join
函数可以让主线程在等待时释放处理器资源,让其他线程更快地执行。
此外,join
函数还可以确保线程在析构前已经执行完毕。如果在线程对象析构时,线程仍然在运行,则程序会终止并报错。因此,在销毁线程对象前调用 join
函数是一种良好的编程实践