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

c++ 多线程全局变量安全操作------原子操作

用以下场景引出问题:
c++可以封装一个延时函数吗,输入参数是延时时间,退出标志,当退出标志有值,就退出延时

是的,C++ 中可以封装一个延时函数,通过传入延时时间以及退出标志控制退出。你可以使用 C++ 的标准库中的多线程和计时功能来实现。比如使用 std::this_thread::sleep_for() 进行延时,std::atomic 作为退出标志来确保线程安全。

下面是一个示例:
#include
#include
#include
#include

void delayWithExitFlag(int delayMilliseconds, std::atomic& exitFlag) {
int elapsedTime = 0;
while (elapsedTime < delayMilliseconds) {
if (exitFlag) {
std::cout << “Exit flag is set. Exiting delay…” << std::endl;
return;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 每次休眠100毫秒
elapsedTime += 100;
}
std::cout << “Delay completed without interruption.” << std::endl;
}

int main() {
std::atomic exitFlag{false}; // 退出标志初始化为 false

// 启动一个线程来执行延时
std::thread delayThread(delayWithExitFlag, 5000, std::ref(exitFlag));  // 延时5秒// 模拟某些操作,1秒后设置退出标志
std::this_thread::sleep_for(std::chrono::seconds(1));
exitFlag = true;delayThread.join();  // 等待延时线程结束
std::cout << "Main thread finished." << std::endl;return 0;

}
解释:
函数 delayWithExitFlag:
输入参数为延时的毫秒数 delayMilliseconds 和退出标志 exitFlag。
通过 std::this_thread::sleep_for() 来执行循环延时,每次延时 100 毫秒。
每次延时后检查退出标志是否为 true,如果是则提前退出。

main() 函数:
使用 std::atomic 作为退出标志,确保在线程间是线程安全的。
延时 1 秒后,设置退出标志为 true 来终止延时。
使用 std::thread 来创建并执行延时函数,在延时完成或收到退出标志后结束。
你可以根据具体的需求调整延时时间和检查间隔的精度。

引申:
C++ 线程里面的全局标志用啥方法是合理规范的, 怎么要让整个代码都知道

在 C++ 中,线程之间的全局标志共享需要确保线程安全,并且设计要尽量符合可维护性和性能的需求。使用 std::atomic 是一种常见且规范的方法来管理线程间共享的全局状态,因为它提供了无锁的线程安全访问。此外,可以考虑使用全局变量或者将标志封装在单例模式中。

  1. 使用 std::atomic 来管理全局连接状态
    如果你的设备连接状态是一个简单的布尔值(连接/断开),可以使用 std::atomic 来管理线程之间的状态共享,这样可以确保多个线程同时读写时不会产生数据竞争。

示例:使用 std::atomic 管理设备连接状态
#include
#include
#include
#include

// 全局设备连接状态标志
std::atomic deviceConnected{false}; // 初始为断开状态

void monitorDeviceConnection() {
while (true) {
// 模拟设备连接状态检测
bool newConnectionState = (std::rand() % 2 == 0); // 随机生成连接/断开状态
if (deviceConnected != newConnectionState) {
deviceConnected = newConnectionState;
if (deviceConnected) {
std::cout << “Device connected!” << std::endl;


http://www.mrgr.cn/news/48506.html

相关文章:

  • 网工内推 | 初级网工,Base北京,IE认证优先,最高14K+餐补
  • Feign的使用
  • 【专题】智启未来:新质生产力引擎驱动下的智能制造行业革新报告合集PDF分享(附原数据表)
  • 邮件营销案例成功技巧:如何打动目标客户?
  • 18063 圈中的游戏
  • 探索极简计算的新边界:从Uxn虚拟机看未来编程生态
  • 儿童画画在线支付预约报名表单在线制作小程序源码系统 带完整的安装代码包以及搭建部署教程
  • 思迅商云8四级分类
  • 哪个牌子的护眼灯防蓝光效果好?五款市场上评价较高的护眼台灯
  • xtu oj 彩球
  • 自监督学习:引领机器学习的新革命
  • Java Mail腾讯企业邮箱或其他邮箱发送邮件失败bug记录
  • MySQL的基础语法-2
  • 电商新动力:SpringBoot购物推荐网站开发详解
  • 国内首个专业领域知识增强服务框架 KAG 技术报告,助力大模型落地垂直领域
  • Apple提出MM1.5:多模态大型语言模型微调的方法、分析和见解
  • Ubuntu卸载Mysql【ubuntu 24.04/mysql 8.0.39】
  • 利用Spring Boot构建医疗病历B2B平台的优势
  • yolo5快速上手训练数据集
  • 125页满分PPT | 数据架构革新顶层规划方案