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 环境…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
