ホームページ >バックエンド開発 >C++ >C++ 同時プログラミング: マルチコア CPU を使用して同時実行を実現するにはどうすればよいですか?

C++ 同時プログラミング: マルチコア CPU を使用して同時実行を実現するにはどうすればよいですか?

PHPz
PHPzオリジナル
2024-05-01 11:51:01324ブラウズ

C 同時プログラミングでは、スレッド、ミューテックス、条件変数を作成することで、マルチコア CPU を最大限に活用します。スレッドを作成すると、タスクを並行して実行できるようになります。ミューテックスは、共有データが複数のスレッドによって同時にアクセスされないようにロックとして機能し、データの破損を回避します。条件変数は、特定の条件が満たされたことをスレッドに通知するために使用され、条件が満たされるまでスレッドが実行を継続しないようにするためにミューテックス ロックとともに使用されます。

C++ 同時プログラミング: マルチコア CPU を使用して同時実行を実現するにはどうすればよいですか?

C 同時プログラミング: マルチコア CPU のロックを解除する

序文

モダンCPU 通常、複数のコアがあり、これらのコアを最大限に活用することで、タスクを並列実行する際のコード効率を大幅に向上させることができます。 C は、プログラマが複数のタスクを同時に実行できるアプリケーションを簡単に作成できるようにするさまざまな同時プログラミング ツールを提供します。

スレッドの作成

スレッドの作成は、同時実行性を表す基本的な構成要素です。 C では、std::thread クラスを使用して新しいスレッドを作成できます。別のスレッドで実行されるタスクを指定する呼び出し可能オブジェクトを引数として受け取ります。

#include <iostream>
#include <thread>

void hello_world() {
  std::cout << "Hello, world!" << std::endl;
}

int main() {
  std::thread thread1(hello_world);
  thread1.join();

  return 0;
}

上記のコードの hello_world() 関数は、単にメッセージをコンソールに出力する呼び出し可能なオブジェクトです。 std::thread コンストラクターは新しいスレッドを作成し、呼び出し可能なオブジェクトを実行します。 thread1.join() 新しいスレッドが完了するまでメインスレッドをブロックします。

ミューテックス ロック

ミューテックス ロックは、スレッドが共有データに同時にアクセスする場合に非常に重要です。これらは、複数のスレッドが重要なセクションに同時にアクセスすることを防ぐロックとして機能し、データの破損を回避します。 C では、std::mutex クラスを使用してミューテックス ロックを作成できます。

#include <iostream>
#include <thread>
#include <mutex>

std::mutex m;  // 全局互斥锁

void increment(int& counter) {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥锁
  ++counter;
}

int main() {
  int counter = 0;

  std::thread thread1(increment, std::ref(counter));
  std::thread thread2(increment, std::ref(counter));

  thread1.join();
  thread2.join();

  std::cout << "Final counter value: " << counter << std::endl;

  return 0;
}

この例では、increment() 関数は共有変数 counter をインクリメントします。 std::lock_guard を使用してミューテックス ロックを取得し、同時に 1 つのスレッドだけがクリティカル セクションを実行できるようにします。このメカニズムにより、2 つのスレッドが同時に counter をインクリメントすることがなくなり、データ競合が回避されます。

条件変数

条件変数は、特定の条件が満たされたことをスレッドに通知するために使用されます。これらは、条件が満たされるまでスレッドが実行を継続しないようにするために、ミューテックス ロックとともに使用されます。 C では、std::condition_variable クラスを使用して条件変数を作成できます。

#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>

std::mutex m;  // 全局互斥锁
std::condition_variable cv;  // 全局条件变量
bool ready = false;  // 共享布尔标志

void producer() {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥锁
  ready = true;                       // 设置共享标志为 true
  cv.notify_one();                   // 通知一个等待的线程
}

void consumer() {
  std::unique_lock<std::mutex> lock(m);  // 获取互斥锁(并锁定它)
  while (!ready)                        // 等待共享标志为 true
    cv.wait(lock);                     // 释放互斥锁并等待
}

int main() {
  std::thread producer_thread(producer);
  std::thread consumer_thread(consumer);

  producer_thread.join();
  consumer_thread.join();

  return 0;
}

この例では、条件変数を使用して、プロデューサー スレッドとコンシューマー スレッド間の対話を調整します。 Producer() この関数は、共有フラグ ready を true に設定し、コンシューマ スレッドに通知します。 consumer() この関数は、条件変数を待機して共有フラグが true になるのを待ってから、実行を続行します。

以上がC++ 同時プログラミング: マルチコア CPU を使用して同時実行を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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