ホームページ  >  記事  >  バックエンド開発  >  C++ でスレッドを作成および管理するにはどうすればよいですか?どのようなスレッド同期メカニズムがありますか?

C++ でスレッドを作成および管理するにはどうすればよいですか?どのようなスレッド同期メカニズムがありますか?

王林
王林オリジナル
2024-05-07 21:03:01551ブラウズ

C のスレッド スレッドは、同時プログラミングを可能にする軽量の実行ユニットです。 std::thread クラスを使用してスレッドを作成し、ミューテックス ロック、条件変数、スピン ロックなどの同期メカニズムを通じて共有データの一貫性を維持します。実際のケースでは、スレッドを使用して合計を同時に計算するプロセスを示します。

C++ 中如何创建和管理线程?有哪些线程同步机制?

C でのスレッドの作成と管理

スレッドは、プロセスと同じアドレス空間を共有し、同時プログラミングを実装できる軽量の実行ユニットです。

スレッドの作成

C では、std::thread クラスを使用してスレッドを作成します:

#include <thread>

void thread_function() {
  // 执行线程任务
}

int main() {
  std::thread thread(thread_function);
  thread.join();  // 阻塞主线程,直到线程执行完毕
  return 0;
}

スレッド同期メカニズム

は、スレッド間の共有データの一貫性を維持するには、同期メカニズムを使用する必要があります:

Mutex (ミューテックス)

#include <mutex>

std::mutex mutex;

void thread_function() {
  std::lock_guard<std::mutex> lock(mutex);
  // 对共享数据进行操作
}

Condition Variable (条件変数)

#include <condition_variable>

std::condition_variable cv;
std::mutex cv_mutex;

void thread_function() {
  std::unique_lock<std::mutex> lock(cv_mutex);
  cv.wait(lock, [] { return condition_is_met; });
  // 条件满足时,继续执行
}

スピンロック (Spinlock)

#include <atomic>

std::atomic_flag spinlock = ATOMIC_FLAG_INIT;

void thread_function() {
  while (spinlock.test_and_set(std::memory_order_acquire));
  // 对共享数据进行操作
  spinlock.clear(std::memory_order_release);
}

実用的なケース

同時計算と合計

#include <thread>
#include <vector>

std::mutex sum_mutex;
long long sum = 0;

void add_numbers(const std::vector<int>& numbers) {
  for (int num : numbers) {
    std::lock_guard<std::mutex> lock(sum_mutex);
    sum += num;
  }
}

int main() {
  std::vector<std::thread> threads;
  std::vector<int> numbers = {...};  // 要相加的数字列表

  // 创建并执行线程
  for (size_t i = 0; i < std::thread::hardware_concurrency(); i++) {
    threads.emplace_back(add_numbers, numbers);
  }

  // 等待所有线程结束
  for (auto& thread : threads) {
    thread.join();
  }

  std::cout << "Sum: " << sum << std::endl;
  return 0;
}

以上がC++ でスレッドを作成および管理するにはどうすればよいですか?どのようなスレッド同期メカニズムがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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