Linux スレッド セーフ ----プロデューサー コンシューマー モデル

目次

1. 生産者と消費者モデル:

1.1、123 ルール:

1.2. アプリケーションシナリオ:

1.3. 利点:

2. コードの実装


1. 生産者と消費者モデル:

1.1、123 ルール:

  • 1. スレッドセーフなキュー: 先入れ先出しの特性を保証するデータ構造がキューと呼べる限り
  • このキューは相互排他を保証する必要があり (つまり、現在 1 つのスレッドのみがそのキューで動作でき、他のスレッドは同時に動作できない)、同期が保証されている必要があります。プロデューサーがキューをいっぱいにするときは、コンシューマーに消費するように通知する必要があります。消費者が消費した後、生産者は生産するように通知されます。
  • 2. 中間の役割のスレッド: プロデューサーとコンシューマー (プロデューサーはキュー内で生成し、コンシューマーはキューからコンテンツを消費します)
  • 3. ルール: プロデューサーとプロデューサーは相互排他的、コンシューマーとコンシューマーは相互排他的、プロデューサーとコンシューマーは相互排他的 + 同期。

1.2. アプリケーションシナリオ:

たとえば、WeChat のバックグラウンド プログラム: プロセスは、さまざまなシナリオでコンシューマーまたはプロデューサーになることができます。

1.3. 利点:

1. 不均一な忙しさ:現時点では、メッセージを受信する可能性のあるスレッドはビジーではなく、メッセージを処理するスレッドは常に作業状態にあります。

2. プロデューサとコンシューマの分離:プロデューサとコンシューマはシリアルに実行されません (シリアル処理とは、プロセスがメッセージを処理する前にメッセージを受信し、処理後にメッセージを送信できることを指します。これがシリアル プロセスです)。ここではコンシューマとプロデューサーを切り離します。メッセージを受信する人は生涯メッセージの受信に費やしますが、メッセージを処理する人はメッセージの処理のみを行い、メッセージを送信する人は送信のみを行います。他のプロセスに影響を与えます。                                                                                                  
3. 高い同時実行性のサポート:複数の人が同時にメッセージを送信する場合、この状況がサポートされます。メッセージを受信するスレッドはメッセージを受信するだけでよく、他のことを感じる必要がないため、受信速度が非常に速くなります。

2. コードの実装

まず、スレッド セーフを実現できるキューが必要であり、このキューは同期と相互排除を保証する必要があります。

 

 生産者と消費者の 2 つのスレッドのシミュレーションを開始します。

 コードを実行しましょう

 この時、積が2回連続で出力される状況が確認されたのですが、コードに問題があるのでしょうか?

それを分析してみましょう:

本質的に、push と printf の 2 つの操作はアトミックではありません。コードをより印象的にするために、push で printf 操作を直接実装できます。

コードを修正してもう一度試してみましょう

この時点で、コードが非常に標準的なものを 1 つ生成し、1 つを消費することがわかったので、成功しました

おすすめ

転載: blog.csdn.net/flyingcloud6/article/details/128226731