生産者 - 消費者モデルではほとんど問題

このシナリオを考えます。

消費者の数、プロデューサー、そして今、パイプラインのキューがいっぱいになっている、プロデューサーがあります。

MutexLockGuardロック(m_mutex)。
一方、(isFull())
    notFull.wait();

 プロデューサーは中)(notFull.waitで目詰まりしています。

この時点で、消費者が製品を取って、notFull.notifyによって()プロデューサーキューが満杯でない知らせ、製造することができます。

生産者は、競争が再びロックから復帰するのを待ちます。

残念ながら、このロックは再び別のコンシューマを取得することです。

このプロセスは、生産者があまりにも戻って指して、続けて、最後の顧客がロックをつかむためになるまでロックを取得していません。

この場合、キューの2例によると:

キューは消費財離れキューから、まだ空でないと、ロックを解除した場合a)の後、生産者は最終的にロックを得て、製品パイプラインを増やすこと。

B)。キューがnotEmpty.waitに、消費者の一方によって、空でない場合()。notEmpty.waitでは()内の、ロックが最初にリリースされ、その後、障害物の中に、そしてプロデューサーは、ロックを取得するために再びでした。

 

機構内部pthread_cond_waitの()関数です。

1)ロックを解除します

2)遮断に

3)ロックのために競争するために目覚めた後

 

1)クリティカルセクションブロックされたロックに捕らえた場合、または、その後、生産者がロックしていないだろうと競争するために、他のスレッドにブロックする前に、スレッドのリリースの存在を確保するための製品を増やすことはできませんし、ロックを消費者に知らせることができません人は、それによってデッドロックを形成します。

 

条件変数の役割は、通知を経由してスレッドがきっかけで待機しているときということですが、スレッドに代わって直接スレッドへの重要なゾーンに入るのではなく、ロックのために競争する資格があります。このような状態変数があるので、条件が満たされただけブロックされたスレッドが競争をロックアウトしますが、何の条件変数が存在しない場合は、あなただけのポーリングによってクリティカルセクションの所有権を競うし続けることができますに、無限のアイドルCPUからなるように条件が満たされるまで解放されたときにロックアウト競争(消費者が製品パイプラインを持っているような、プロデューサーパイプラインは空です)。

おすすめ

転載: www.cnblogs.com/lxy-xf/p/11317855.html