Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk mengendalikan akses serentak apabila menggunakan C++ STL?
在并发访问共享数据结构中,C++ STL 提供了处理数据竞争的机制:互斥量:仅允许一个线程同时访问共享数据;读写锁:允许多个线程同时读取但仅一个线程写入;原子操作:无需锁就能进行简单的操作,如计数器递增。
如何使用 C++ STL 处理并发访问
在并发编程中,并发访问共享数据结构可能会导致数据竞争和程序崩溃。C++ 标准模板库 (STL) 为处理此类场景提供了强大的机制。
互斥量 (互斥锁)
互斥量是一种轻量级锁,仅允许一个线程同时访问共享数据。以下是使用互斥量保护 std::vector
的示例:
#include <iostream> #include <mutex> #include <vector> std::mutex vector_mutex; std::vector<int> shared_vector; void thread_function() { std::lock_guard<std::mutex> lock(vector_mutex); // 访问 shared_vector,知道不会被其他线程并发访问 }
读写锁
读写锁允许多个线程同时读取共享数据,但仅允许一个线程写入。以下是使用读写锁保护 std::map
的示例:
#include <iostream> #include <shared_mutex> #include <map> std::shared_mutex map_mutex; std::map<std::string, int> shared_map; void reader_thread_function() { std::shared_lock<std::shared_mutex> lock(map_mutex); // 读取 shared_map } void writer_thread_function() { std::unique_lock<std::shared_mutex> lock(map_mutex); // 写入 shared_map }
原子操作
对于简单的操作(如递增或递减计数器),我们可以使用原子操作,无需使用锁。以下是使用原子操作更新 int
的示例:
#include <atomic> std::atomic<int> shared_counter; void thread_function() { shared_counter.fetch_add(1); }
实战案例
以下是一个使用 C++ STL 并发的真实案例:
Web 服务并发访问共享缓存
问题:一个 Web 服务使用 std::unordered_map
作为缓存,多个线程同时访问缓存。
解决方案:使用读写锁保护 std::unordered_map
。这允许多个线程同时读取缓存,而只允许一个线程更新缓存,从而避免数据竞争。
Atas ialah kandungan terperinci Bagaimana untuk mengendalikan akses serentak apabila menggunakan C++ STL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!