线程+匿名函数,解决函数阻塞问题
工作中,我们会遇到这样一种场景,就是某个函数,是被外部调用的,而且要求这个被调用的函数不能阻塞,不能太耗时,否则会影响外部的正常调用。
比如,示例中的TestA函数,它是被外部调用的,而且是一个耗时的操作,它还修改了外部的其他变量。
这时候,需要用线程来解耦,避免TestA函数因为太过耗时而阻塞。
因为改变了外部变量,因此匿名函数还用到了 引用 作为参数。
这里用到匿名函数,主要是 有些时候不需要单独再去写一个函数 来包装一些操作。
都丢到匿名函数里面,作为参数,传递个一个 thread 的对象,在创建对象的时候就会去执行。
关键代码就是标红色的这部分,用匿名函数写法会比较简洁。
线程对象 + 匿名函数,实现了 TestA 方法的非阻塞调用。
场景限制:如果 TestA 调用非常频繁(每3秒1次不算频繁,每秒几次就频繁了),那么这种方法就不适用了。因为频繁的申请线程资源,会增加服务器负载,影响性能。
那种情况就要考虑其他方式来解决函数阻塞的情况了。比如C++的协程,用异步方式来执行。不过C++协程语法比较复杂,可以参考ts的协程语法来理解协程。
#include <iostream> #include <string> #include <vector> #include <thread> using namespace std; //g++ main.cpp --std=c++11 -lpthread -o a.bin // 用线程+匿名函数,解决 函数阻塞问题.此处的 TestA 函数是非阻塞的 void TestA(int& A, int & B) { cout <<"11 --- A:"<<A<<"|B:"<<B<<endl<<flush; // 弄一个线程,detach thread th( [&]{ //1.比较耗时的操作 //2.修改了外部变量 A=3; B=4; this_thread::sleep_for(chrono::seconds(3));//1000ms cout <<"44 --- A:"<<A<<"|B:"<<B<<endl<<flush; } ); th.detach(); cout <<"22 --- A:"<<A<<"|B:"<<B<<endl<<flush; } // g++ main.cpp --std=c++11 -lpthread int main() { // 外部的2个变量 int A1 = 1; int B1 = 2; TestA(A1, B1);// TestA 会改变外部参数 cout <<"33 --- A:"<<A1<<"|B:"<<B1<<endl<<flush; this_thread::sleep_for(chrono::seconds(8));//1000ms cout <<"55 --- A:"<<A1<<"|B:"<<B1<<endl<<flush; cout <<"-------hello end! -------"<<endl<<flush; return 0; }
执行情况:
[upchina@localhost demo3]$ g++ main.cpp --std=c++11 -lpthread -o a.bin [upchina@localhost demo3]$ [upchina@localhost demo3]$ [upchina@localhost demo3]$ ./a.bin 11 --- A:1|B:2 22 --- A:1|B:2 33 --- A:1|B:2 44 --- A:3|B:4 55 --- A:3|B:4 -------hello end! -------