用过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中实现是通过静态函数指针实现。
来源:CSDN
作者:m08090420
链接:https://blog.csdn.net/m08090420/article/details/103753872