线程间通信
线程间通信
- 介绍
- 信息通知
- 条件锁通知
- eventfd
- 结尾
介绍
这种主要介绍线程间的一些通信方式,后续会一直维护。这里应该要分两种。第一肯定就是消息通知。第二就是数据通信。这里主要讲的还是消息通知。
首先说一些,为什么会有信息通知。例如你想要指导某一个i/o是否有数据。或者某一个消息是否收到。如果不通知,那么系统就需要不间断的去检查,目标文件描述符是否有数据。这样就比较浪费系统性能。如果有数据可以被通知,这样就不用浪费系统性能了;
信息通知
条件锁通知
条件锁应该是最常用,相对比较简单的,线程之间信息通知的案例。
他的好处是什么呢,就是简单。对于不太复杂的线程之间的消息通知,我感觉非常的合适。第二个搭配队列有时候,就可以满足一些高峰时段消息处理方法。
#include<mutex>#include<condition_variable>#include<queue>#include<chrono>structContData{std::string Cont_Mess;//这里就是消息内容,std::chrono::system_clock::time_point Time;//这里是该消息,接收到的时候,记录一下时间};std::queue<ContData>CtDatas;std::mutex mtx;std::condition_variable cv;intsec=1;//条件通知,不能让等待线程一致傻等着,还得设置一下,等带时长,intDataMax=512;//队列最多就放512个数据intWrite_contData(conststd::string&data){std::lock_guard<std::mutex>lock(mtx);if(CtDatas.size()>DataMax){return-1;}ContData CtData;CtData.Time=std::chrono::system_clock::now();CtData.Cont_Mess=data;CtDatas.push(CtData);cv.notify_one();return0;}intRead_ContData(ContData*recv){std::unique_lock<std::mutex>lock(mtx);//下面加入一些时间限制,我是想到,如果出现意外,没有通知到,也应该检查一些队列,总是没问题的boolcond_met=cv.wait_for(lock,std::chrono::seconds(sec),[&]{return!CtDatas.empty()});if(CtDatas.empty()){return-1;}*recv=std::move(CtDatas.front());CtDatas.pop();lock.unlock();return0;}eventfd
eventfd就是也可以作为线程间消息通知,不过其需要初始化,体量以及需要的系统资源比条件锁要多一些。第二个就是其只能传数字。这个局限性比较大,就是只能作为通知,数据是传不了一点。
如果你的系统中,已经有了epoll,那么顺手加上eventfd,进行通知,我感觉也不是不行。对于多任务处理,也蛮不错的。
结尾
后续有时间继续更新
