C++ のスレッドローカル ストレージ (TLS) は、マルチスレッド環境で各スレッドのプライベート データを維持するメカニズムを提供し、複数のスレッドが変数に同時にアクセスした場合でも、相互に干渉しないようにします。 thread_local キーワードを使用してローカル変数を宣言すると、各スレッドで変数の個別のインスタンスが作成され、データの分離が確保されます。このメカニズムを使用すると、スレッド固有のカウンター、ステータス フラグ、その他のプライベート データを維持し、マルチスレッド プログラミングにおけるデータ競合の問題を回避できます。
C++ 同時プログラミング: スレッドローカル ストレージの活用
スレッドローカル ストレージ (TLS) は、マルチスレッド環境で各スレッドのプライベート データを維持するためのメカニズムです。 C++ では、thread_local
キーワードを使用して TLS を実装できます。 thread_local
关键字实现 TLS。
作用原理
thread_local
声明用于声明一个局部变量,该变量在每个线程中具有单独的实例。当访问该变量时,编译器将生成一个线程特定的存储位置,并且变量的值将仅存储在该位置。这确保了即使来自不同线程的多个线程正在同时访问该变量,它们也不会彼此干扰。
语法
语法如下:
thread_local <type> variable;
其中:
type
是变量的类型。variable
是变量的名称。实战案例
我们来看一个用 TLS 在多线程应用程序中计算全局计数器的示例:
// 定义一个全局计数器变量,没有任何线程安全保护 int global_counter = 0; // 定义一个线程局部计数器变量 thread_local int thread_local_counter = 0; // 执行增加计数器的线程函数 void increment_counter() { // 增加全局计数器 global_counter++; // 增加线程局部计数器 thread_local_counter++; } int main() { // 创建多个线程 std::vector<std::thread> threads; for (int i = 0; i < 10; i++) { threads.push_back(std::thread(increment_counter)); } // 等待所有线程完成 for (auto& thread : threads) { thread.join(); } // 输出结果 std::cout << "Global counter: " << global_counter << std::endl; // 可能不是预期的值 std::cout << "Thread local counter: " << thread_local_counter << std::endl; // 将输出每个线程的局部计数器值 }
在这个示例中,global_counter
可能会有并发的访问问题,导致不准确的结果。而 thread_local_counter
thread_local
宣言は、各スレッドで個別のインスタンスを持つローカル変数を宣言するために使用されます。変数にアクセスすると、コンパイラはスレッド固有の格納場所を生成し、変数の値はその場所にのみ格納されます。これにより、異なるスレッドからの複数のスレッドが同時に変数にアクセスしている場合でも、それらが相互に干渉しないことが保証されます。 🎜🎜🎜文法🎜🎜🎜 構文は次のとおりです: 🎜rrreee🎜 ここで: 🎜type
は変数の型です。 variable
は変数の名前です。 global_counter
は次のようになります。同時アクセスの問題が発生し、不正確な結果が発生します。また、thread_local_counter
により、各スレッドが個別のカウンタ インスタンスを持つことが保証され、データ競合の問題は発生しません。 🎜以上がC++ 同時プログラミング: スレッドローカル ストレージを利用するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。