C++ 同時プログラミング: スレッド間通信を処理するには?

WBOY
リリース: 2024-05-04 12:45:02
オリジナル
445 人が閲覧しました

C でのスレッド間通信の方法には、共有メモリ、同期メカニズム (ミューテックス ロック、条件変数)、パイプライン、およびメッセージ キューが含まれます。たとえば、ミューテックス ロックを使用して共有カウンタを保護します。ミューテックス ロック (m) と共有変数 (counter) を宣言し、各スレッドがロック (lock_guard) によってカウンタを更新するようにします。競合状態を防ぐため。

C++ 同時プログラミング: スレッド間通信を処理するには?

#C 同時プログラミング: スレッド間通信をどのように処理するか?

マルチスレッド アプリケーションでは、スレッドが相互に通信してタスクを調整し、データを共有できる必要があります。 C は、スレッド間通信を実装するためのさまざまなメカニズムを提供します。

共有メモリ

共有メモリを使用すると、複数のスレッドが同じメモリ領域にアクセスできます。これはオーバーヘッドの低いアプローチですが、競合状態を避けるために注意する必要があります。

int shared_data = 0;

void thread_1() {
  shared_data++; // 可能会被其他线程同时访问
}

void thread_2() {
  shared_data++; // 可能会同时导致不正确的结果
}
ログイン後にコピー

同期メカニズム

同期メカニズムは、共有リソースにアクセスするときにスレッドを調整するために使用できます。

Mutex (ミューテックス)

ミューテックス ロックは相互排他的アクセスを提供し、一度に 1 つのスレッドのみが共有リソースにアクセスできるようにします。

std::mutex m;

void thread_1() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  // 访问共享资源
}

void thread_2() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  // 访问共享资源
}
ログイン後にコピー

条件変数

条件変数を使用すると、スレッドは特定の条件が満たされるまで待機できます。

std::condition_variable cv;
std::mutex m;

void producer() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  while (!condition) {
    // 等待条件满足
    cv.wait(l);
  }
  // 生产数据
}

void consumer() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  condition = true;
  cv.notify_all(); // 唤醒所有等待线程
}
ログイン後にコピー

Pipe

パイプラインは、2 つのスレッド間でデータを送信するために使用される一方向通信メカニズムです。

std::pipe pipe;

void writer() {
  std::string message = "hello";
  std::write(pipe[1], message.c_str(), message.length());
}

void reader() {
  std::string message;
  std::read(pipe[0], message.data(), message.size());
}
ログイン後にコピー

Message Queue(メッセージ キュー)

Message Queue は、非同期メッセージ配信メカニズムを提供します。

key_t key = ftok("message_queue", 'a');

int message_queue = msgget(key, IPC_CREAT | 0666);

void sender() {
  Message msg;
  msg.mtext = "hello";
  msgsnd(message_queue, &msg, sizeof(msg.mtext), IPC_NOWAIT);
}

void receiver() {
  Message msg;
  msgrcv(message_queue, &msg, sizeof(msg.mtext), 0, 0);
}
ログイン後にコピー

実際的なケース: ミューテックスを使用して共有カウンターを保護する

複数のスレッドによって同時に更新する必要がある共有カウンターがあるとします。ミューテックスを使用してこのカウンタを保護できます。

std::mutex m;
int counter = 0;

void thread_1() {
  for (int i = 0; i < 1000000; i++) {
    std::lock_guard<std::mutex> l(m);
    counter++;
  }
}

void thread_2() {
  for (int i = 0; i < 1000000; i++) {
    std::lock_guard<std::mutex> l(m);
    counter--;
  }
}
ログイン後にコピー

これにより、常に 1 つのスレッドだけがカウンタを更新できるようになり、競合状態が防止されます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート