ホームページ  >  記事  >  バックエンド開発  >  C++ メモリ管理におけるスレッド セーフ

C++ メモリ管理におけるスレッド セーフ

PHPz
PHPzオリジナル
2024-05-02 16:06:01396ブラウズ

C のスレッドセーフなメモリ管理は、複数のスレッドが共有データに同時にアクセスするときにデータの破損や競合状態が発生しないようにすることで、データの整合性を保証します。重要なポイント: スレッドセーフな動的メモリ割り当てには、std::shared_ptr や std::unique_ptr などのスマート ポインターを使用します。ミューテックス (std::mutex など) を使用して、複数のスレッドによる同時アクセスから共有データを保護します。実際のケースでは、共有データとマルチスレッド カウンターを使用して、スレッド セーフなメモリ管理のアプリケーションを示します。

C++ 内存管理中的线程安全

#C メモリ管理におけるスレッド セーフティ

スレッド セーフティとは、複数のスレッドが共有データに同時にアクセスした場合に、データの破損や競合が発生しないことを意味します。問題。 C では、マルチスレッドを使用する場合、共有データと同期アクセスが関係するため、メモリ管理が非常に重要です。

動的メモリ割り当て

C では、動的メモリ割り当てに

new 演算子と delete 演算子を使用します。ただし、これらの演算子自体はスレッドセーフではありません。

int *ptr = new int;
delete ptr;

複数のスレッドがこのコードを同時に使用すると、解放後の使用の問題や二重解放の問題が発生する可能性があります。

スレッド セーフな動的メモリ割り当て

スレッド セーフな動的メモリ割り当てを確保するために、C 標準ライブラリにはスレッド セーフな代替手段がいくつか用意されています。

    # std::shared_ptr:
  • 複数のスレッドで同時に安全に共有できるスマート ポインター。参照カウントを使用して共有範囲を追跡し、ポインタを参照するスレッドがなくなったときにメモリを解放します。
  • std::unique_ptr:
  • 1 つのスレッドのみが所有できるスマート ポインター。オブジェクトが不要になるとすぐにメモリを解放します。
  • 例: スレッドセーフな共有リソース

共有リソース (統計など) を含むクラスを考えてみましょう:

class SharedData {
public:
  std::mutex mtx; // 互斥锁
  int count = 0;

  void increment() {
    std::lock_guard<std::mutex> lock(mtx); // 获取互斥锁
    ++count;
  }
};

このクラスはミューテックス ロックを使用します

mtx

は、複数のスレッドが同時に increment() メソッドにアクセスしたときにカウントが破損しないように共有データを保護します。 実践的なケース: マルチスレッド カウンター

次に、スレッド セーフな動的メモリ割り当てと同期の使用方法を示す実践的なケースを示します。

#include <iostream>
#include <thread>
#include <vector>
#include <memory>

std::shared_ptr<SharedData> sharedData = std::make_shared<SharedData>();

void incrementThread() {
  for (int i = 0; i < 1000000; ++i) {
    sharedData->increment();
  }
}

int main() {
  std::vector<std::thread> threads;
  for (int i = 0; i < 10; ++i) {
    threads.emplace_back(incrementThread);
  }

  for (auto &thread : threads) {
    thread.join();
  }

  std::cout << "Final count: " << sharedData->count << std::endl;

  return 0;
}

このプログラムは、共有データを作成し、それを

std::shared_ptr

として参照します。次に、10 個のスレッドを作成し、それぞれのスレッドでカウンターが 1,000,000 回インクリメントされます。メインスレッドはすべてのスレッドが終了するのを待ち、最後に最終カウントを出力します。

以上がC++ メモリ管理におけるスレッド セーフの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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