线程+匿名函数,解决函数阻塞问题

工作中,我们会遇到这样一种场景,就是某个函数,是被外部调用的,而且要求这个被调用的函数不能阻塞,不能太耗时,否则会影响外部的正常调用。

 

比如,示例中的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! -------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章