あります:単一プロバイダ、単一消費者。条件変数に適しているもの:pthread_cond_t、sem_t、pthread_mutex_t?
条件変数 "var":varの値は0または1のみです。
1つのプロバイダスレッド "thP":ネットから受信したデータ、set var 1(available);
1つのコンシューマスレッド "thC":wait()for var。 varが得られたら、それを0(使用不可能)に設定し、その後何かを処理する。
。
私はこの単純なモデルを実装するには2つの方法が見つかりました:
は、(1)VARとしてpthread_cond_t使用してください。 このメソッドは、スレッドがクリーンアップされている間にmutexのロックを解除するために、追加のmutexとコールバック関数を必要とします。
(2)varとしてsem_tを使用してください。 この方法では、状況が「var> 1」になることがあります。 thCは、varの値を1に減らすために複数のwait()操作を実行することがあります。
。
質問は次のとおりです。
どのタイプIは、VAR、pthread_cond_t、sem_tまたは単にバイナリセマフォとしてpthread_mutex_t使用するために使用する必要があり、この単純なモデル「単一のプロバイダ、単一のコンシューマ、1つの条件変数」を実装するには?
。
ありがとうございました!
アトミック性を提供しないセマフォ?それはセマフォではありません! –
@MartinJames、セマフォ自体はアトミックです。しかし、キューに追加することと、posixセマフォに原子_together_をポストすることの両方を追加することはできません。 – bdonlan
はい - キューはスレッドセーフでなければならないため、セマフォだけでなく、ロック(スレッドセーフなロックフリーキュー)が必要です。 –