C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)

这篇具有很好参考价值的文章主要介绍了C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主线程和子线程进行list通信,要用到互斥锁,避免同时操作
1、封装线程基类XThread控制线程启动和停止;
2、模拟消息服务器线程,接收字符串消息,并模拟处理;
3、通过Unique_lock和mutex互斥方位list 消息队列
4、主线程定时发送消息给子线程;

代码包含了XThread类(基类)、XMsgSever类(消息)、测试主程序

//XThread.h 类(基类)
#pragma once
#include <thread>

//基类
class XThread
{
public:
	virtual void Start();//启动线程
	virtual void Stop();//设置线程退出标志,并等待
	virtual void Wait();//等待
	virtual bool is_exit();//线程是否退出

private:
	virtual void Main() = 0;//线程入口,纯虚函数,子函数必须单独实现
	bool is_exit_ = false;
	std::thread th_;

};

//XThread.cpp 类(基类)
#include "XThread.h"

using namespace std;//在CPP中引用using namespace
void XThread::Start()//启动线程
{
	is_exit_ = false;//不要退出
	th_ = thread(&XThread::Main,this);

}
void XThread::Stop()//设置线程退出标志,并等待
{
	is_exit_ = true;
	Wait();

}
void XThread::Wait()//等待
{
	if (th_.joinable())
	{
		th_.join();
	}

}
bool XThread::is_exit()//线程是否退出
{
	return is_exit_;
}
//XMsgSever.h 类
#pragma once
#include "XThread.h"
#include <list>
#include <mutex>
class XMsgSever:public XThread
{
public:
	//给当前线程发消息
	void SendMsg(std::string msg);



private:
	void Main()override;//重写main,override检查名字是否写错

	
	std::list<std::string> msgs_;//消息队列缓冲

	std::mutex mux_;//互斥访问消息队列
};


//XMsgSever.cpp 类
#include "XMsgSever.h"
#include <iostream>

using namespace std;


void XMsgSever::SendMsg(std::string msg)
{//消息生产者
	unique_lock<mutex> lock(mux_);//为了保证list的线程安全,加锁
	msgs_.push_back(msg);
}

void XMsgSever::Main()
{//消息消费者
	while (!is_exit())
	{
		this_thread::sleep_for(10ms);
		unique_lock<mutex> lock(mux_);
		if (msgs_.empty())
		{//如果没有消息,则continue
			continue;
		}
		while (!msgs_.empty())
		{//消息处理业务逻辑
			cout << "recv: " << msgs_.front().c_str() << endl;
			msgs_.pop_front();
		}

	}

}

//测试主程序
/*

1、封装线程基类XThread控制线程启动和停止;
2、模拟消息服务器线程,接收字符串消息,并模拟处理;
3、通过Unique_lock和mutex互斥方位list<string> 消息队列
4、主线程定时发送消息给子线程;

*/

#include "XMsgSever.h"
#include <sstream>
using namespace std;

int main()
{
	XMsgSever server;
	server.Start();//启动子线程,调了Main入口,进入死循环消费信息了
	for (int i = 0; i < 10; i++)
	{
		stringstream ss;
		ss << "msg: " << i + 1;
		server.SendMsg(ss.str());
		this_thread::sleep_for(500ms);
	}
	server.Stop();
	printf("All done!\n");

	return 0;
}

运行结果:
C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信),C++,多线程,c++,list,开发语言文章来源地址https://www.toymoban.com/news/detail-618558.html

到了这里,关于C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 第三章 LInux多线程开发 3.1-3.5线程创建 终止 分离

    第三章 LInux多线程开发 3.1-3.5线程创建 终止 分离

    一般情况下,main函数所在的线程我们称之为 主线程(main线程) ,其余创建的线程称之为子线程。 程序中默认只有一个进程,fork()函数调用,2进行 程序中默认只有一个线程,pthread_create()函数调用,2个线程。 #include pthread.h int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

    2024年02月09日
    浏览(13)
  • 编程的实践理论 第三章 函数理论

    如果我们解释规则的使用,我们总是允许发明新的语法。新的语法的 一个好的来源是名称(标识符),通过公理给出了规则是如何使用的。 通常,当我们介绍名称和公理时,我们要它们实现当前的目的。读者 被假定理解它们的作用域,就是它们的应用范围,在它的范围外不

    2024年02月07日
    浏览(13)
  • 《TCP IP网络编程》第三章

    《TCP IP网络编程》第三章

    3.1 分配给套接字的IP地址与端口号         IP 是 Internet Protocol(网络协议)的简写,是为收发网络数据而分配给计算机的值。端口号并非赋予计算机的值,而是为了区分程序中创建的套接字而分配给套接字的序号。              为使计算机连接到网络并收发数据,必

    2024年02月13日
    浏览(11)
  • 《Opencv3编程入门》学习笔记—第三章

    《Opencv3编程入门》学习笔记—第三章

    记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 一、图像的载入、显示和输出到文件 (一)OpenCV的命名空间 简单的OpenCV程序标配: (二)Mat类简析 表示从指定路径下把名为dota.jpg的图像载入到Mat类型的srcImage 变量中。 (三)图像的载入与显示概述

    2024年02月08日
    浏览(40)
  • 第三章 MATLAB的分支语句和编程设计

            在前面的章节中,我们开发了几个完全运转的 MATLAB 程序。但是这些程序都十分 简单,包括一系列的 MATLAB 语句,这些语句按照固定的顺序一个接一个的执行。像这 样的程序我们称之顺序结构程序。它首先读取输入,然后运算得到所需结果,打印出结 果,并退出。至

    2024年02月05日
    浏览(8)
  • CMD与DOS脚本编程【第三章】

    预计更新 第一章. 简介和基础命令 1.1 介绍cmd/dos脚本语言的概念和基本语法 1.2 讲解常用的基础命令和参数,如echo、dir、cd等 第二章. 变量和运算符 2.1 讲解变量和常量的定义和使用方法 2.2 介绍不同类型的运算符和运算规则 第三章. 控制流程和条件语句 3.1 介绍if、else、for、

    2024年02月06日
    浏览(6)
  • C++[第三章]--程序结构

    class里面的函数实现可以放到class外面实现,class里面声明即可。所以这部代码可以放到.h文件中如: 在cpp里面实现这些函数即可如: 多个cpp文件出现同名函数(非类里面的函数)会混淆。 定义:.h/.cpp文件中: 调用者源文件中: 直接使用: a::fun, a::fun2 using声明: using a::fun; // 以后

    2024年02月15日
    浏览(9)
  • 第三章:R语言编程 第六节:模块模式

    模块是一种结构,由无法从外部访问的数据以及操纵这些数据的函数组成,是标准化代码编写技术 模块模式的优点 1.因为无法从外部访问数据,所以很好的隐藏了内部实现,说人话就是无需考虑数据在模块内部是如何保存的 2.其次,因为只能借助实现定义的函数访问模块内部

    2024年03月11日
    浏览(8)
  • 基于linux下的高并发服务器开发(第三章)- 3.8 线程同步
  • Linux 第三章:实验案例:MySQL服务器的构建与维护

    Linux 第三章:实验案例:MySQL服务器的构建与维护

    实验环境 某公司因业务范围臼益扩大.最近订购了---套基于B/S架构的电子商务系统.在正式部署之前,要求对现有的httpd服务器进行改造,首先需要增加MySQL数据库服务。 需求描述 1,为MySOL数据库的root 用户设置密码.删除用户名.密码为空的用户记录。 2,新建名为“bdqn”

    2024年02月05日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包