Windows C++マルチスレッド(十一):生産者消費者モデル


マルチスレッドといえば、生産者と消費者という古典的なモデルがあります.例えば倉庫では、積載量が定数Nであり、現在の貨物数がSであり、工場を生産者とし、販売は消費者であると仮定する.以下の状況を見てください.
  (1)0
(2)S>N、生産を停止し、貨物が積み込まれなくなり、販売できる
(3)S=0で販売できず、生産が必要である.
生産者と消費者モデルは「PV操作」の進化であり、Windowsではマルチスレッド同期反発がオペレーティングシステムの重点と難点である.PV操作の起源と使い方についてお話しします.1962年、オランダの学者DijksrtaはX 8コンピュータの開発に参加し、マルチプログラムの実行能力を持つオペレーティングシステムであるTHE Multiprogramming Systemを設計し実現した.このオペレーティングシステムにおけるプロセス(スレッド)の同期と反発の問題を解決するために、彼は列車運行制御システムにおける「信号灯」(semaphore、または「信号量」と呼ばれる)概念を巧みに利用して解決した.信号量の値が0より大きい場合、現在利用可能なリソースの数を表す.値が0より小さい場合、その絶対値は、リソースの使用を待つプロセスの数を表します.なお、この信号量の値はPV操作のみで変更可能である.PV操作は、P操作原語とV操作原語からなり(原語はアトミック操作Atomic Operationとも呼ばれ、中断不可能なプロセスである)、信号量(Windowsにおける信号量メカニズムと混同しないように注意)を操作し、具体的には、P(S):1信号量Sの値を1に減算する、すなわちS=S-1;②S>=0の場合、当該プロセスは継続する.そうでなければ、プロセスは待機状態に設定されます.V(S):1信号量Sの値を1とする、すなわちS=S+1とする.②当該プロセスは引き続き実行する;信号の待機キューに待機プロセスがある場合、待機プロセスが起動します.PV操作でマルチスレッドの同期と反発を実現することは非常に簡単であり,具体的な技術的詳細を考慮することなく論理処理が合理的で厳密であることを考慮すれば,擬似コードを書くことと類似している.
次はwindowsイベントで消費者と生産者モデルを実現します.
#include 
#inclu