大挪耗

c++回调函数的实现

#include "iostream"
#include "mutex"
#include "deque"      //deque容器的头文件
#include "queue"    //queue容器的头文件
#include "condition_variable"  //条件变量的头文件
#include "functional"
#include "thread"
using namespace::std;
void show(const string&message)
{
    //处理业务的普通函数
    cout<<"处理数据:"<<message<<endl;
}

struct BB{
    //处理业务的类
    void show(const string &message)
    {
        cout<<"处理表白数据:"<<message<<endl;
    }
};

class AA
        {
            mutex m_mutex;   //互斥锁
            condition_variable m_cond;  //添加变量
            queue <string ,deque<string>>m_q;  //缓存队列底层容器用deque。
            function<void (const string&)>m_callback;  //回调函数对象。

            public:
                //注册回调函数,回调函数只有一个参数(消费者接收到的数据)。
            template<typename Fn,typename ...Args>
            void callback(Fn &&fn,Args &&...args){
                m_callback=bind(forward<Fn>(fn),forward<Args>(args)...,std::placeholders::_1);//绑定回调函数
            }
            void incache(int num)//生存数据,num指定数据的个数。
            {
                lock_guard<mutex> lock(m_mutex);//申请加锁
                for (int ii = 0; ii < num; ++ii) {
                    static int bh=1; //超女编号。
                    string message=to_string(bh++)+"号超女";//拼凑出一个数据。
                    m_q.push(message);  //把生产出来的数据入队。
                }
                m_cond.notify_one();//唤醒一个当前条件变量阻塞的线程。

            }
            void outcache()
            {
                while(true)
                {

                        string message;
                        //把互斥锁转换成unique_lock<mutex>,并申请加锁。
                        unique_lock<mutex> lock(m_mutex);
                        //1)把互斥锁开;2)阻塞,等待被唤醒;3)给互斥锁加锁、
                    m_cond.wait(lock,[this]{return !m_q.empty();});
                        //数据元素出队.
                        message = m_q.front();
                        m_q.pop();
                        cout<<"线程:"<< this_thread::get_id()<<","<<message <<endl;
                        lock.unlock();//手工解锁.



                    //处理出队的数据(把数据消费掉)。
                    if (m_callback)m_callback(message);//回调函数,把收到的数据传给它.

                }
            }

};

int main()
{
AA aa;
//aa.callback(show);    //普通函数show()注册为回调函数.
BB bb;
aa.callback(&BB::show,&bb);    //把成员函数BB::show()注册为回调函数

thread t1(&AA::outcache,&aa);//创建消费者线程t1.
thread t2(&AA::outcache,&aa);//创建消费者线程t2.
thread t3(&AA::outcache,&aa);//创建消费线程线程t3.

this_thread::sleep_for(chrono::seconds(2));
aa.incache(2);//生产2个数据。

this_thread::sleep_for(chrono::seconds(2));//休眠2秒。
aa.incache(2);//生产2个数据

t1.join();//回收线程的资源。
t2.join();
}

线程:3,1号超女
处理表白数据:1号超女
线程:3,2号超女
处理表白数据:2号超女
线程:4,3号超女
处理表白数据:3号超女
线程:4,4号超女
处理表白数据:4号超女


已发布

分类

可以收藏大挪耗一下。下载麻烦点城通网盘,站长保证下载速度,不会限速的,放心点就是了;分卷,安卓下载为txt:程序下载为url,不会下载参考不会下载。如果你想让本站活的久一点,请直接捐助

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注