2012-04-26 5 views
1

あります:単一プロバイダ、単一消費者。条件変数に適しているもの: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つの条件変数」を実装するには?

ありがとうございました!

答えて

0

単一のコンシューマの単一プロバイダの境界キューの例では、これは通常、2つの条件付き変数(「キューが満杯ではないときに通知される」と「キューが空でない」ときに通知される) )。

アルゴリズムは次のようになります。

post(item): 
    lock; 
    while (queue is full): 
    wait(cvar_queue_not_full); 
    queue.push(item) 
    signal(cvar_queue_not_empty); 
    unlock; 

consume(): 
    lock; 
    while (queue is empty): 
    wait(cvar_queue_not_empty); 
    item = queue.shift(item); 
    signal(cvar_queue_not_full); 
    unlock; 
    return item; 

これは本質的に有界セマフォですが、アトミック同時にキューポップ/セマフォとプッシュを調整することができます。残念ながら、POSIXセマフォは無制限であり、アトミック性を提供しません。

+0

アトミック性を提供しないセマフォ?それはセマフォではありません! –

+0

@MartinJames、セマフォ自体はアトミックです。しかし、キューに追加することと、posixセマフォに原子_together_をポストすることの両方を追加することはできません。 – bdonlan

+0

はい - キューはスレッドセーフでなければならないため、セマフォだけでなく、ロック(スレッドセーフなロックフリーキュー)が必要です。 –

関連する問題