共有データ構造への同時アクセスでは、C++ STL はデータ競合を処理するメカニズムを提供します。mutex: 1 つのスレッドのみが共有データに同時にアクセスできるようにします。読み取り/書き込みロック: 複数のスレッドが同時に読み取りを許可します。書き込み用の 1 つのスレッド; アトミック操作: カウンタのインクリメントなどの単純な操作をロックなしで実行できます。
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_map
rrreee
std::map
を保護するために読み取り/書き込みロックを使用する例を次に示します。 🎜rrreee🎜🎜アトミック操作🎜🎜🎜 カウンタのインクリメントまたはデクリメントなどの単純な操作の場合、アトミック操作を使用せずに使用できます。ロック。以下は、アトミック操作を使用して int
を更新する例です: 🎜rrreee🎜🎜実用的なケース🎜🎜🎜 以下は、C++ STL 同時実行性を使用した実際のケースです: 🎜🎜🎜共有キャッシュへの Web サービスの同時アクセス🎜 🎜🎜🎜 問題: 🎜 Web サービスは std::unowned_map
をキャッシュとして使用し、複数のスレッドが同時にキャッシュにアクセスします。 🎜🎜🎜解決策: 🎜読み取り/書き込みロックを使用して std::unowned_map
を保護します。これにより、複数のスレッドが同時にキャッシュを読み取ることができる一方で、1 つのスレッドのみがキャッシュを更新できるため、データ競合が回避されます。 🎜以上がC++ STL を使用するときに同時アクセスを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。