ホームページ  >  記事  >  バックエンド開発  >  C++ STL を使用するときに同時アクセスを処理するにはどうすればよいですか?

C++ STL を使用するときに同時アクセスを処理するにはどうすればよいですか?

王林
王林オリジナル
2024-06-04 18:20:00676ブラウズ

共有データ構造への同時アクセスでは、C++ STL はデータ競合を処理するメカニズムを提供します。mutex: 1 つのスレッドのみが共有データに同時にアクセスできるようにします。読み取り/書き込みロック: 複数のスレッドが同時に読み取りを許可します。書き込み用の 1 つのスレッド; アトミック操作: カウンタのインクリメントなどの単純な操作をロックなしで実行できます。

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

C++ STL を使用して同時アクセスを処理する方法

同時プログラミングでは、共有データ構造への同時アクセスがデータ競合やプログラムのクラッシュにつながる可能性があります。 C++ 標準テンプレート ライブラリ (STL) は、このようなシナリオを処理するための強力なメカニズムを提供します。

Mutex (ミューテックスロック)

ミューテックスは、同時に 1 つのスレッドのみが共有データにアクセスできるようにする軽量のロックです。以下は、ミューテックスを使用して std::vector を保護する例です。 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_maprrreee

🎜読み取り/書き込みロック🎜🎜🎜読み取り/書き込みロックでは、複数のスレッドが共有データを同時に読み取ることができますが、許可されるのは書き込むスレッドが 1 つ入ります。 std::map を保護するために読み取り/書き込みロックを使用する例を次に示します。 🎜rrreee🎜🎜アトミック操作🎜🎜🎜 カウンタのインクリメントまたはデクリメントなどの単純な操作の場合、アトミック操作を使用せずに使用できます。ロック。以下は、アトミック操作を使用して int を更新する例です: 🎜rrreee🎜🎜実用的なケース🎜🎜🎜 以下は、C++ STL 同時実行性を使用した実際のケースです: 🎜🎜🎜共有キャッシュへの Web サービスの同時アクセス🎜 🎜🎜🎜 問題: 🎜 Web サービスは std::unowned_map をキャッシュとして使用し、複数のスレッドが同時にキャッシュにアクセスします。 🎜🎜🎜解決策: 🎜読み取り/書き込みロックを使用して std::unowned_map を保護します。これにより、複数のスレッドが同時にキャッシュを読み取ることができる一方で、1 つのスレッドのみがキャッシュを更新できるため、データ競合が回避されます。 🎜

以上がC++ STL を使用するときに同時アクセスを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。