c++11 线程同步与互斥如何使用

news/2024/11/18 3:23:04/

在 C++11 中,线程同步和互斥可以使用互斥量、条件变量以及原子操作来实现。

互斥量主要用于控制对共享资源的访问。当多个线程需要访问同一共享资源时,需要采用互斥量来保证在任一时刻只有一个线程能访问该资源,从而防止数据竞争和内存泄漏的问题。C++11 引入了 std::mutex,用于保护共享的数据或代码段。当一个线程需要访问共享资源时,它必须首先获取互斥量的锁,以确保其他线程无法同时访问该资源。当该线程完成它的工作后,必须释放互斥量的锁,以允许其他线程访问该共享资源。以下是一个简单的示例:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void print_thread_id(int id) {mtx.lock();std::cout << "Thread " << id << std::endl;mtx.unlock();
}int main() {std::thread t1(print_thread_id, 1);std::thread t2(print_thread_id, 2);t1.join();t2.join();return 0;
}

在上述代码中,mtx 变量被用作互斥量,print_thread_id() 函数需要获取 mtx 的锁才能执行输出任务。

条件变量主要用于线程之间的通信和同步。当一个线程需要等待某个事件的发生时(比如某个共享资源变为可用),可以调用条件变量的 wait() 函数将自己挂起等待,直到另外一个线程通知该条件变量,才能继续执行。以下是一个简单的示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void print_id(int id) {std::unique_lock<std::mutex> lock(mtx);while(!ready)cv.wait(lock);std::cout << "Thread " << id << std::endl;
}void go() {std::unique_lock<std::mutex> lock(mtx);ready = true;cv.notify_all();
}int main() {std::thread threads[10];for (int i=0; i<10; ++i)threads[i] = std::thread(print_id,i);std::cout << "10 threads ready to race...\n";go(); // go!for (auto& th : threads) th.join();return 0;
}

在上述代码中,mtxcv 变量被用作互斥量和条件变量,print_id() 函数需要获取 mtx 的锁才能执行输出任务,而 go() 函数则通过 cv.notify_all() 来通知等待条件变量的线程开始执行。

原子操作主要用于保证对特定数据类型的操作在多线程环境下是原子性的,即不会被中断。C++11 提供了 std::atomic 类型来实现原子操作,例如 std::atomic<int>。以下是一个简单的示例:

#include <iostream>
#include <thread>
#include <atomic>std::atomic<int> counter(0);void increment_counter() {counter++;
}int main() {std::thread t1(increment_counter);std::thread t2(increment_counter);t1.join();t2.join();std::cout << "Counter value: " << counter << std::endl;return 0;
}

在上述代码中,counter 变量被定义为 std::atomic<int> 类型,而 increment_counter() 函数对其进行原子自增操作。


http://www.ppmy.cn/news/383926.html

相关文章

Android Chrome Custom Tabs

参考文档 API文档 链接 Chrome Custom Tabs 参考文档 https://developer.chrome.com/docs/android/custom-tabs/ Chrome Custom Tabs最佳实践_customtabs_Just_Sanpark的博客-CSDN博客 Chrome Custom Tabs最佳实践_chrome custom tabs集成_wxx614817的博客-CSDN博客 Chrome…

Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用 (June 2023)

适用于 Android™️ 的 Windows 子系统&#xff0c;2023 年 6 月更新 请访问原文链接&#xff1a;https://sysin.org/blog/wsa/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 适用于 Android™️ 的 Windows 子系统使你的 Wi…

Vmware 设置固定ip地址--桥接模式

前言&#xff1a; 若虚拟机没有设置固定ip地址&#xff0c;每次关机重启后都会更新ip地址。导致连接工具得跟着一起修改&#xff0c;每次修改很烦。 之前使用NAT模式&#xff0c;因为使用此模式后&#xff0c;每次打开网页都会转几秒钟后才会显示网页。所以才使用桥接模式&…

自定义修改Typora原生默认github风格样式

使用typora的时候&#xff0c;想要自定义一些颜色、字体&#xff0c;或者修改一些设置&#xff0c;这个时候需要修改或者自己编写css文件。 修改涉及的样式&#xff1a; ① 目录 ② 块应用 我还是比较喜欢原生自带的默认样式&#xff08;github样式&#xff09;&#xff0c; 但…

巽风游戏攻略苹果手机免越狱群控

巽风游戏是一款非常火爆的手机游戏&#xff0c;吸引了众多游戏玩家前来体验。作为一款玄幻题材的游戏&#xff0c;它有着丰富的剧情和系统&#xff0c;对于新手玩家来说&#xff0c;可能会感到有些困难。那么今天小编就给大家带来巽风游戏的最新攻略&#xff0c;帮助大家更好地…

黑客发布兼容苹果 iOS 15 和 iOS 16 的越狱工具

12 月 15 日消息&#xff0c;苹果公司一直在努力提高其操作系统和设备的安全性&#xff0c;黑客已经越来越难为 iOS 创建越狱工具。不过 palera1n 团队通过不懈努力&#xff0c;近日发布了一个越狱工具&#xff0c;不仅兼容 iOS 15&#xff0c;而且还兼容 iOS 16。 越狱能够移除…

如何实现微信多开,苹果手机无需越狱

I. 前言 本文的前言部分主要介绍了研究背景、研究目的、研究内容和研究方法。其中研究背景介绍了微信双开的概念和应用&#xff0c;并指出苹果手机的微信双开是一个热门话题。研究目的是为了探究苹果手机上微信双开的可行性和实现方法。研究内容包括系统架构设计、模块功能设计…

苹果4s怎么越狱_越狱软件续签教程

基本操作首先 点点「在看」支持哦 几乎所有的越狱用户都会遇到过同样一个问题&#xff0c;那就是关于软件失效的问题 越狱的用户都知道 现在的越狱基本都是引导越狱 通过手机软件或者电脑软件引导越狱&#xff0c;越狱方式相对以前来说简单了很多也安全了很多「但也会有白苹果的…