C++学习6
C++学习6
- 基础知识
- std::thread
- 实战
- boost domain socket server
基础知识
std::thread
std::thread是C++11标准库中的一个类,用于创建并发执行的线程。它的详细用法如下:
- 头文件
#include <thread>
- 创建线程
std::thread t(func, args...);
其中,func是线程要执行的函数,args是传递给函数的参数。创建线程后,线程会立即开始执行func函数。
- 等待线程结束
t.join();
join()函数会阻塞当前线程,直到t线程执行完毕。
- 分离线程
t.detach();
detach()函数会将t线程与当前线程分离,使得t线程在后台继续执行,当前线程不再等待t线程执行完毕。
- 判断线程是否可执行
if (t.joinable()) {// ...
}
joinable()函数用于判断线程是否可执行,如果线程已经被join()或detach(),则返回false。
- 获取线程ID
std::thread::id id = t.get_id();
get_id()函数用于获取线程的ID。
- 线程休眠
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
sleep_for()函数用于让当前线程休眠一段时间,ms是休眠的毫秒数。
- 线程同步
C++11标准库中提供了多种线程同步的机制,如互斥锁、条件变量、原子操作等。这些机制可以用于保证多个线程之间的数据同步和互斥访问。
实战
boost domain socket server
#include <cstdio>
#include <iostream>
#include <boost/array.hpp>
#include <boost/bind/bind.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>#if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)namespace CVpn {
using boost::asio::local::stream_protocol;class UnixSocketSession : public boost::enable_shared_from_this<UnixSocketSession>
{
public:UnixSocketSession(boost::asio::io_context &ioContext,std::function<std::optional<std::string>(std::string &)> msgProc) : socket(ioContext), msgProc(msgProc){}stream_protocol::socket &GetSocket(){return socket;}void Start(){socket.async_read_some(boost::asio::buffer(data), boost::bind(&UnixSocketSession::HandleRead,shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));}void HandleRead(const boost::system::error_code &error, size_t bytes_transferred){if (!error) {// 处理消息std::cout << "UnixSocketSession: HandleRead: ok, data=" << data.data() << std::endl;std::string message(data.data(), bytes_transferred);auto replay = msgProc(message);if (replay.has_value()) { // 返回值非空表示有消息要回复给客户端boost::asio::async_write(socket, boost::asio::buffer(replay.value()),boost::bind(&UnixSocketSession::HandleWrite, shared_from_this(), boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));}} else {std::cout << "UnixSocketSession: HandleRead: fail, error:" << error.message() << std::endl;}}void HandleWrite(const boost::system::error_code &error, size_t bytes_transferred){if (!error){std::cout << "UnixSocketSession: HandleWrite: replay ok, bytes=" << bytes_transferred << std::endl;socket.async_read_some(boost::asio::buffer(data),boost::bind(&UnixSocketSession::HandleRead,shared_from_this(),boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));} else {std::cout << "UnixSocketSession: HandleWrite: fail, error:" << error.message() << std::endl;}}private:stream_protocol::socket socket; // 用于跟客户端通信的socketstd::function<std::optional<std::string>(std::string &)> msgProc; // 收到客户端消息后的消息处理函数boost::array<char, 1024> data; // 用于保存从客户端接收的数据
};class UnixServer
{
public:UnixServer(boost::asio::io_context &ioContext, const std::string &filePath,std::function<std::optional<std::string>(std::string &)> handler) :ioc(ioContext),acceptor(ioContext, stream_protocol::endpoint(filePath)),workingStatus(STOPPING),msgProc(handler){}void Start(){workingStatus = RUNNING;boost::shared_ptr<UnixSocketSession> newSession(new UnixSocketSession(ioc, msgProc));acceptor.async_accept(newSession->GetSocket(),boost::bind(&UnixServer::HandleAccept, this, newSession, boost::asio::placeholders::error));}void Stop(){workingStatus = STOPPING;acceptor.close();}// 测试接口void TestSetServerStopping(){workingStatus = STOPPING;}void HandleAccept(boost::shared_ptr<UnixSocketSession> newSession,const boost::system::error_code &error){if (!error) {std::cout << "UnixServer: HandleAccept: ok" << std::endl;newSession->Start();} else {std::cout << "UnixServer: HandleAccept: fail, error:" << error.message() << std::endl;}if (workingStatus == RUNNING) {// reset后会将之前的newSession对象的共享计数减一,等该session不再运行后就会自动回收相关资源newSession.reset(new UnixSocketSession(ioc, msgProc));acceptor.async_accept(newSession->GetSocket(),boost::bind(&UnixServer::HandleAccept, this, newSession, boost::asio::placeholders::error));}}private:boost::asio::io_context &ioc;stream_protocol::acceptor acceptor;enum {RUNNING, STOPPING,} workingStatus;// 收到客户端消息后回调用户传入的消息处理函数,如果返回值非空表示有消息要回复给客户端std::function<std::optional<std::string>(std::string &)> msgProc;
};
} // namespace CVpn
#else // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
# error Local sockets not available on this platform.
#endif // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
相关文章:
C++学习6
C学习6 基础知识std::thread 实战boost domain socket server 基础知识 std::thread std::thread是C11标准库中的一个类,用于创建并发执行的线程。它的详细用法如下: 头文件 #include <thread>创建线程 std::thread t(func, args...);其中&am…...
bazel使用中存在的问题
只开远端缓存时。kernel采用的bazel编译,遇到如下问题: 1、Action 详情二进制文件解析为文本文件时报错,无法进一步比较分析导致缓存不命中的原因。--- JDK版本的问题 2、远端缓存全部命中时间收益不明显 ---需分析是否为网络原因 3、$HOM…...
svn软连接和文件忽略
软连接 1)TortoiseSVN->Properties->New->Externals->New 2)填入软连接信息 Local path: 写下软连接后的文件夹的名字 URL: 想要软连接的牡蛎->TortoiseSVN->Repo-browser 复制下填入 文件忽略 以空格隔开就行...
自动驾驶攻城战,华为小鹏先亮剑
点击关注 文|刘俊宏 编|苏扬、王一粟 本文为光锥智能x腾讯科技联合出品 2023年过半,城市NOA(城市领航辅助驾驶)的元年如预期中到来了吗? 8月25日,成都车展开幕,与4个月之前的上海…...
企业供应链数字化怎么做?企业数字化供应链流程落地方式
什么是供应链?简单来说,供应链是围绕客户需求,以提高产品流通各个环节的效率为目标,通过资源整合的方式来实现产品从设计、生产到销售、服务整个环节的组织形态。如同人工智能、区块链、5G等技术的发展带来的各种行业变化…...
java八股文面试[多线程]——synchronized 和lock的区别
其他差别: synchronized是隐式的加锁,lock是显式的加锁; synchronized底层采用的是objectMonitor,lock采用的AQS; synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列, lock有一个同步队列,可以有多个等待队列; synchronized使用了object类的wait和noti…...
实现一个简单的控制台版用户登陆程序, 程序启动提示用户输入用户名密码. 如果用户名密码出错, 使用自定义异常的方式来处理
//密码错误异常类 public class PasswordError extends Exception {public PasswordError(String message){super(message);} }//用户名错误异常类 public class UserError extends Exception{public UserError(String message){super(message);} }import java.util.Scanner;pu…...
Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式
面试专题-设计模式 前言 在平时的开发中,涉及到设计模式的有两块内容,第一个是我们平时使用的框架(比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中ÿ…...
Anaconda Prompt输入jupyter lab无反应
问题:Anaconda Prompt界面输入指令无反应 原因:公司电脑勒索病毒防御工具阻止了进程 解决:找到黑名单恢复进程...
JavaScript Web APIs - 05 Window对象 、本地存储
Web APIs - 05 文章目录 Web APIs - 05js组成window对象定时器-延迟函数location对象navigator对象histroy对象本地存储(今日重点)localStorage(重点)sessionStorage(了解)localStorage 存储复杂数据类型 综…...
Ansible学习笔记6
stat模块:获取文件的状态信息,类似Linux的stat状态。 获取/etc/fstab文件的状态。 [rootlocalhost tmp]# ansible group1 -m stat -a "path/etc/fstab" 192.168.17.106 | SUCCESS > {"ansible_facts": {"discovered_inter…...
Linux挖矿程序清除
1. 找到挖矿进程 2.找到病毒的文件地址 ls -l /proc/进程ID/exe3.删除文件命令 rm -rf 文件地址4.杀死挖矿进程 kill -9 进程ID...
使用Git和Github上传代码文件
1. 先检查是否安装好git git --version2. 输入你的github用户名 git config --global user.name "用户名"3. 输入你的github邮件 git config --global user.email "邮件地址"4. 设定git推送本地仓库中与远程仓库中具有相同名称的所有分支。 git config…...
OpenAI发布ChatGPT企业级版本
本周一(2023年8月28日)OpenAI 推出了 ChatGPT Enterprise,这是它在 4 月份推出的以业务为中心的订阅服务。该公司表示,根据新计划,不会使用任何业务数据或对话来训练其人工智能模型。 “我们的模型不会从你的使用情况中…...
vue3中axios的使用方法
在Vue 3中使用axios发送HTTP请求的方法与Vue 2中基本相同。首先,需要安装axios库: npm install axios然后,在Vue组件中引入axios: import axios from axios;接下来,可以在Vue组件的方法中使用axios发送HTTP请求。例如…...
【docker】容器的运行、停止、查看等基本操作
容器与镜像的区别 image镜像 Docker image是一个read-only文件,位于磁盘上这个文件包含文件系统,源码,库文件,依赖,工具等一些运行application所需要的文件可以理解成一个模板docker image具有分层的概念 container…...
Python|OpenCV-鼠标自动绘制图像(4)
前言 本文是该专栏的第4篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在本专栏之前,有详细介绍使用OpenCV绘制图形以及添加文字的方法,感兴趣的同学可往前翻阅查看“Python|OpenCV-绘制图形和添加文字的方法(2)”。 而本文重点来介绍使用OpenCV来操作鼠标,以…...
IDEA 设置提示信息
IDEA 设置提示信息 File->Settings->Editor->Code Completion 取消勾选 Math case...
清理docker镜像方法
首先stop ps -a里的容器,然后rm容器,最后再rmi镜像 先停止容器 rm容器 docker rmi 镜像 删除后可以发现已经不存在...
windows 搭建 swoole开发环境(官网已支持)
第一步下载:swoole官网下载 swoole-cli-v5.0.3-cygwin-x64.zip 只支持 64 位的系统 第二步解压到指定文件夹:E:\phpstudy_pro\WWW\swoole-cli-v5.0.3-cygwin-x64 第三步设置环境变量:把解压后的文件夹下的 bin 目录路径配置到系统的 Path 环境…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%
本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...
