首页 > 后端开发 > C++ > 正文

使用 C++ STL 时如何处理并发访问?

王林
发布: 2024-06-04 18:20:00
原创
665 人浏览过

在并发访问共享数据结构中,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。这允许多个线程同时读取缓存,而只允许一个线程更新缓存,从而避免数据竞争。

以上是使用 C++ STL 时如何处理并发访问?的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!