c++++ 多线程安全库函数提供了多线程环境中的安全数据操作:std::atomic:提供原子类型,进行原子读取和写入操作,确保同时只有一个线程修改值。std::mutex:提供互斥量,允许线程独占访问共享资源,通过 lock() 和 unlock() 函数获取和释放。std::condition_variable:提供条件变量,允许线程等待特定事件发生,与互斥量结合使用。
C++ 中的多线程安全库函数
在多线程环境中,线程安全至关重要,以防止意外修改共享资源。C++ 标准库提供了多种多线程安全的函数,可帮助您编写健壮的多线程程序。
std::atomic
立即学习“C++免费学习笔记(深入)”;
此库提供了一组原子类型,允许线程安全地操作基本数据类型。原子类型提供原子读取和写入操作,确保没有其他线程同时修改该值。
实战案例:线程安全计数器
#include <iostream> #include <atomic> // 定义一个原子整数 counter std::atomic<int> counter(0); // 线程函数,递增计数器 void incrementCounter() { counter++; } int main() { // 创建 10 个线程 std::thread threads[10]; // 启动线程来递增计数器 for (int i = 0; i < 10; i++) { threads[i] = std::thread(incrementCounter); } // 加入线程 for (int i = 0; i < 10; i++) { threads[i].join(); } // 打印最终计数 std::cout << "最终计数:" << counter << std::endl; return 0; }
std::mutex
此库提供了一个互斥量类,允许线程独占访问共享资源。互斥量可以通过 lock() 和 unlock() 函数获得和释放。
实战案例:临界区
#include <iostream> #include <mutex> std::mutex m; // 定义一个互斥量 void accessSharedResource() { // 获取互斥量 m.lock(); // 访问共享资源 // 释放互斥量 m.unlock(); } int main() { // 为 10 个线程创建互斥量 std::thread threads[10]; // 启动线程 for (int i = 0; i < 10; i++) { threads[i] = std::thread(accessSharedResource); } // 加入线程 for (int i = 0; i < 10; i++) { threads[i].join(); } return 0; }
std::condition_variable
此库提供了一个条件变量类,允许线程等待特定事件发生。条件变量与互斥量一起使用。
实战案例:生产者-消费者问题
#include <iostream> #include <mutex> #include <condition_variable> std::mutex m; // 定义一个互斥量 std::condition_variable cv; // 定义条件变量 bool ready = false; // 布尔标志表示生产者是否已生产 void producer() { // 获取互斥量 m.lock(); // 生产数据 std::cout << "生产者生产数据" << std::endl; ready = true; // 唤醒消费者线程 cv.notify_one(); // 释放互斥量 m.unlock(); } void consumer() { // 获取互斥量 m.lock(); // 等待生产者生产数据 while (!ready) { cv.wait(m); } // 消费数据 std::cout << "消费者消费数据" << std::endl; ready = false; // 释放互斥量 m.unlock(); } int main() { // 为生产者和消费者线程创建互斥量、条件变量和布尔标志 std::thread producerThread(producer); std::thread consumerThread(consumer); // 加入线程 producerThread.join(); consumerThread.join(); return 0; }
以上就是哪些 C++ 函数库函数是多线程安全的?的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系 yyfuon@163.com