c++实现boost中的post函数功能

删除回忆录丶 提交于 2020-01-24 09:48:59

用过boost中post函数后发现她可以接收任意无参函数包括lambda函数,但是对于boost的使用内心是有点抵触的,前面两个项目使用boost后导致编译特别慢,所以不想在使用它了,小团队根本就没有代码审查这种东西,头文件包含越写越乱,最后导致基本上所以的cpp文件都间接包含了boost中的库文件,最后发现整个项目头文件依赖达到百万个之多。但是boost中确实有很多值得学习的东西,既然是好东西拿就自己实现。翻看了boost代码之后发现其实很简单代码如下:

class CFuncEventBase
{
public:
    CFuncEventBase() {}
    virtual ~CFuncEventBase() {}
    virtual void CallFunc() = 0;
};
template <class HandleType>
class CFunctionEvent :public CFuncEventBase
{
public:
    CFunctionEvent(HandleType handle):m_Handle(handle){}
    virtual void CallFunc()override { m_Handle(); }
private:
    HandleType m_Handle;
};
class CThreadEvent
{
public:
    CThreadEvent() {}
    ~CThreadEvent() {}
    template< class Handler>
    void Post(Handler handle){m_queue.emplace_back(new CFunctionEvent<Handler>(handle));}
    CFuncEventBase* Pop()
    {
        auto tmp = m_queue.front();
        m_queue.pop_front();
        return tmp;
    }
    bool IsEmpty()const { return m_queue.empty(); }
private:
    std::list<CFuncEventBase*>  m_queue;
};

下面提供一个简单的使用例子,代码如下:

void Func1() { printf("function\n"); }
int main()
{
    CThreadEvent eventQueue;
    eventQueue.Post(&Func1);
    eventQueue.Post([]() {printf("test\n");});
    while (!eventQueue.IsEmpty())
    {
        auto tmp = eventQueue.Pop();
        tmp->CallFunc();
        delete tmp;
    }
}

这样就实现了post函数的功能,在加上线程无锁队列或者有锁队列等等就可以实现在a线程post一个任意函数到b线程执行,然后等待b线程执行完之后在调用a线程中的指定函数。boost中实现是通过静态函数指针实现。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!