线程间通信

发布时间:2026/6/10 13:00:16

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

相关新闻