C++ 同時プログラミング: スレッドローカル ストレージを利用するには?

王林
リリース: 2024-05-06 13:42:02
オリジナル
604 人が閲覧しました

C++ のスレッドローカル ストレージ (TLS) は、マルチスレッド環境で各スレッドのプライベート データを維持するメカニズムを提供し、複数のスレッドが変数に同時にアクセスした場合でも、相互に干渉しないようにします。 thread_local キーワードを使用してローカル変数を宣言すると、各スレッドで変数の個別のインスタンスが作成され、データの分離が確保されます。このメカニズムを使用すると、スレッド固有のカウンター、ステータス フラグ、その他のプライベート データを維持し、マルチスレッド プログラミングにおけるデータ競合の問題を回避できます。

C++ 同時プログラミング: スレッドローカル ストレージを利用するには?

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 は変数の名前です。
🎜🎜実際的なケース🎜🎜🎜TLS を使用してマルチスレッド アプリケーションでグローバル カウンタを計算する例を見てみましょう: 🎜rrreee🎜 この例では、global_counter は次のようになります。同時アクセスの問題が発生し、不正確な結果が発生します。また、thread_local_counter により、各スレッドが個別のカウンタ インスタンスを持つことが保証され、データ競合の問題は発生しません。 🎜

以上がC++ 同時プログラミング: スレッドローカル ストレージを利用するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!