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 是一种常见且规范的方法来管理线程间共享的全局状态,因为它提供了无锁的线程安全访问。此外,可以考虑使用全局变量或者将标志封装在单例模式中。
- 使用 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;