介绍

这种主要介绍线程间的一些通信方式,后续会一直维护。这里应该要分两种。第一肯定就是消息通知。第二就是数据通信。这里主要讲的还是消息通知。
首先说一些,为什么会有信息通知。例如你想要指导某一个i/o是否有数据。或者某一个消息是否收到。如果不通知,那么系统就需要不间断的去检查,目标文件描述符是否有数据。这样就比较浪费系统性能。如果有数据可以被通知,这样就不用浪费系统性能了;

信息通知

条件锁通知

条件锁应该是最常用,相对比较简单的,线程之间信息通知的案例。
他的好处是什么呢,就是简单。对于不太复杂的线程之间的消息通知,我感觉非常的合适。第二个搭配队列有时候,就可以满足一些高峰时段消息处理方法。

#include <mutex>
#include <condition_variable>
#include <queue>
#include <chrono>

struct ContData
{
    std::string Cont_Mess;							//这里就是消息内容,
    std::chrono::system_clock::time_point Time;		//这里是该消息,接收到的时候,记录一下时间
};

std::queue<ContData> CtDatas;
std::mutex mtx;
std::condition_variable cv;
int sec = 1;					//条件通知,不能让等待线程一致傻等着,还得设置一下,等带时长,
int DataMax = 512;  			//队列最多就放512个数据


int Write_contData(const std::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();
	return 0;
}

int Read_ContData(ContData* recv)
{
	std::unique_lock<std::mutex> lock(mtx);
	//下面加入一些时间限制,我是想到,如果出现意外,没有通知到,也应该检查一些队列,总是没问题的
	bool cond_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();
	return 0;
}

eventfd

eventfd就是也可以作为线程间消息通知,不过其需要初始化,体量以及需要的系统资源比条件锁要多一些。第二个就是其只能传数字。这个局限性比较大,就是只能作为通知,数据是传不了一点。
如果你的系统中,已经有了epoll,那么顺手加上eventfd,进行通知,我感觉也不是不行。对于多任务处理,也蛮不错的。

结尾

后续有时间继续更新

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐