ホームページ  >  記事  >  バックエンド開発  >  共有オブジェクトを変更するとき、std::shared_ptr はスレッドセーフですか?

共有オブジェクトを変更するとき、std::shared_ptr はスレッドセーフですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-09 22:55:02212ブラウズ

Is std::shared_ptr Thread-Safe When Modifying Shared Objects?

std::shared_ptr スレッド セーフについて

ドキュメントでは、制御ブロックのスレッド セーフについて言及しています。オブジェクトの共有所有権を管理します。複数のスレッドは競合することなく基礎となるリソースの所有権を共有するため、異なるshared_ptrオブジェクトに同時にアクセスできます。ただし、これは共有オブジェクト自体の変更の安全性を保証するものではありません。

Shared_ptr とオブジェクトの変更

コード例では、スレッド 1 はグローバルのプライベート コピーを作成します。スレッド 2 はグローバル自体を変更しますが、shared_ptr を使用します。以下は動作の説明です:

  • スレッド 1 のプライベートは、最初はグローバルの元の値に設定されます。
  • スレッド 2 がグローバルを変更しても、プライベート ポイントとしてプライベートのポインタには影響しません。
  • ただし、private は最終的に破棄され、によって変更された制御ブロック内の参照カウントがデクリメントされます。スレッド 2.
  • プライベートは有効なshared_ptrのままですが、その有効期間は変更されたグローバルとは無関係です。

スレッドの安全性に関する考慮事項

複数のスレッドで共有されるオブジェクトを安全に変更するには、std::mutex などの同期メカニズムを使用する必要があります。次の例は、ミューテックスを使用したスレッドセーフな構成更新を示しています。

// Shared pointer to the configuration object
std::shared_ptr<Configuration> global_config = make_shared<Configuration>();

// Mutex to protect the configuration object
std::mutex config_mutex;

void thread_fcn() {
    // Lock the mutex before accessing the configuration
    std::lock_guard<std::mutex> lock(config_mutex);

    // Update the configuration from global_config
    // ...

    // Unlock the mutex after finishing the update
}

global_config を変更する前にミューテックスを取得することで、他のスレッドからの干渉を防ぎます。これにより、構成が常に一貫性のあるスレッドセーフな方法で更新されることが保証されます。

以上が共有オブジェクトを変更するとき、std::shared_ptr はスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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