当前位置: 首页 > news >正文

C++学习6

C++学习6

  • 基础知识
    • std::thread
  • 实战
    • boost domain socket server

基础知识

std::thread

std::thread是C++11标准库中的一个类,用于创建并发执行的线程。它的详细用法如下:

  1. 头文件
#include <thread>
  1. 创建线程
std::thread t(func, args...);

其中,func是线程要执行的函数,args是传递给函数的参数。创建线程后,线程会立即开始执行func函数。

  1. 等待线程结束
t.join();

join()函数会阻塞当前线程,直到t线程执行完毕。

  1. 分离线程
t.detach();

detach()函数会将t线程与当前线程分离,使得t线程在后台继续执行,当前线程不再等待t线程执行完毕。

  1. 判断线程是否可执行
if (t.joinable()) {// ...
}

joinable()函数用于判断线程是否可执行,如果线程已经被join()或detach(),则返回false。

  1. 获取线程ID
std::thread::id id = t.get_id();

get_id()函数用于获取线程的ID。

  1. 线程休眠
std::this_thread::sleep_for(std::chrono::milliseconds(ms));

sleep_for()函数用于让当前线程休眠一段时间,ms是休眠的毫秒数。

  1. 线程同步

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标准库中的一个类&#xff0c;用于创建并发执行的线程。它的详细用法如下&#xff1a; 头文件 #include <thread>创建线程 std::thread t(func, args...);其中&am…...

bazel使用中存在的问题

只开远端缓存时。kernel采用的bazel编译&#xff0c;遇到如下问题&#xff1a; 1、Action 详情二进制文件解析为文本文件时报错&#xff0c;无法进一步比较分析导致缓存不命中的原因。--- JDK版本的问题 2、远端缓存全部命中时间收益不明显 ---需分析是否为网络原因 3、$HOM…...

svn软连接和文件忽略

软连接 1)TortoiseSVN->Properties->New->Externals->New 2)填入软连接信息 Local path: 写下软连接后的文件夹的名字 URL: 想要软连接的牡蛎->TortoiseSVN->Repo-browser 复制下填入 文件忽略 以空格隔开就行...

自动驾驶攻城战,华为小鹏先亮剑

点击关注 文&#xff5c;刘俊宏 编&#xff5c;苏扬、王一粟 本文为光锥智能x腾讯科技联合出品 2023年过半&#xff0c;城市NOA&#xff08;城市领航辅助驾驶&#xff09;的元年如预期中到来了吗&#xff1f; 8月25日&#xff0c;成都车展开幕&#xff0c;与4个月之前的上海…...

企业供应链数字化怎么做?企业数字化供应链流程落地方式

什么是供应链&#xff1f;简单来说&#xff0c;供应链是围绕客户需求&#xff0c;以提高产品流通各个环节的效率为目标&#xff0c;通过资源整合的方式来实现产品从设计、生产到销售、服务整个环节的组织形态。如同人工智能、区块链、5G等技术的发展带来的各种行业变化&#xf…...

java八股文面试[多线程]——synchronized 和lock的区别

其他差别&#xff1a; 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 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

面试专题-设计模式 前言 在平时的开发中&#xff0c;涉及到设计模式的有两块内容&#xff0c;第一个是我们平时使用的框架&#xff08;比如spring、mybatis等&#xff09;&#xff0c;第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#xff…...

Anaconda Prompt输入jupyter lab无反应

问题&#xff1a;Anaconda Prompt界面输入指令无反应 原因&#xff1a;公司电脑勒索病毒防御工具阻止了进程 解决&#xff1a;找到黑名单恢复进程...

JavaScript Web APIs - 05 Window对象 、本地存储

Web APIs - 05 文章目录 Web APIs - 05js组成window对象定时器-延迟函数location对象navigator对象histroy对象本地存储&#xff08;今日重点&#xff09;localStorage&#xff08;重点&#xff09;sessionStorage&#xff08;了解&#xff09;localStorage 存储复杂数据类型 综…...

Ansible学习笔记6

stat模块&#xff1a;获取文件的状态信息&#xff0c;类似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企业级版本

本周一&#xff08;2023年8月28日&#xff09;OpenAI 推出了 ChatGPT Enterprise&#xff0c;这是它在 4 月份推出的以业务为中心的订阅服务。该公司表示&#xff0c;根据新计划&#xff0c;不会使用任何业务数据或对话来训练其人工智能模型。 “我们的模型不会从你的使用情况中…...

vue3中axios的使用方法

在Vue 3中使用axios发送HTTP请求的方法与Vue 2中基本相同。首先&#xff0c;需要安装axios库&#xff1a; npm install axios然后&#xff0c;在Vue组件中引入axios&#xff1a; import axios from axios;接下来&#xff0c;可以在Vue组件的方法中使用axios发送HTTP请求。例如…...

【docker】容器的运行、停止、查看等基本操作

容器与镜像的区别 image镜像 Docker image是一个read-only文件&#xff0c;位于磁盘上这个文件包含文件系统&#xff0c;源码&#xff0c;库文件&#xff0c;依赖&#xff0c;工具等一些运行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里的容器&#xff0c;然后rm容器&#xff0c;最后再rmi镜像 先停止容器 rm容器 docker rmi 镜像 删除后可以发现已经不存在...

windows 搭建 swoole开发环境(官网已支持)

第一步下载&#xff1a;swoole官网下载 swoole-cli-v5.0.3-cygwin-x64.zip 只支持 64 位的系统 第二步解压到指定文件夹&#xff1a;E:\phpstudy_pro\WWW\swoole-cli-v5.0.3-cygwin-x64 第三步设置环境变量&#xff1a;把解压后的文件夹下的 bin 目录路径配置到系统的 Path 环境…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #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 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...