2016-12-03 4 views
0

3コンシューマ2プロデューサ。 1つのバッファへの読み書き。 プロデューサAは1要素をバッファ(長さN)にプッシュし、プロデューサBは2要素をバッファにプッシュしています。アクティブ待ちなし。 System Vセマフォを使用することはできません。生産者Aのためのプロデューサ - 2要素を作成するコンシューマプロデューサPOSIXセマフォ

サンプルコード:彼らは読み取りまたは消費以外

void producerA(){ 
    while(1){ 
    sem_wait(full); 
    sem_wait(mutex); 

    Data * newData = (Data*) malloc(sizeof(Data)); 
    newData->val = generateRandomletter(); 
    newData->A = false; 
    newData->B = false; 
    newData->C = false; 

    *((Data*) mem+tail) = *newData; 

    ++elements; 
    tail = (tail + 1) % N; 

    sem_post(mutex); 
    sem_post(empty); 
    } 
} 

消費者は同じように見えるが、それは無関係です。 私はもちろん、私は、私はまた、2つ以上の空きがある最初の時間を引き上げたことになる生産者Bのための異なるセマフォを持ってみました

sem_wait(full); sem_wait(full); 

のようなものを行うことはできませんプロデューサーBで多くの問題が生じていますバッファ内のスポット。しかし、セマフォーを適切に低くして大きくする必要があるので、これはうまくいかなかったfullempty

この問題をどのように解決できますか?

+0

条件変数は、私が必要とするテクニックであるように見えます。 –

+0

私はプロセス中でアクティブな待ちをすることができないので、ループの繰り返しごとに条件をチェックすることはできません。よりスマートなものがあれば、私はそれを感謝するでしょう。 – Aaroneiros

+1

条件変数の全ポイントは、アクティブ待ちを避けることです。 –

答えて

0

https://gist.github.com/RobPiwowarek/65cb9896c109699c70217ba014b9ed20 それは私が持っていた問題全体の解決策になります。

TLDR: 私が提供できる最も簡単な同期は、セマフォーfullemptyを使用して、バッファにプッシュした要素の数を表すことでした。しかし、私は2つの要素を作成するプロデューサを持っている場合、その種の解決策はPOSIXセマフォに対しては機能しません。

私の解決策は、別の概念です。私は、これは将来的に誰かの役に立つことを願っ

while(1){ 
    down(mutex); 
    size = get size 
    if (condition related to size based on what process this is) 
    { 
     do your job; 
     updateSize(int diff); // this can up() specific semaphores 
           // based on size 
           // each process has his own semaphore 
     up(mutex); 
    } 
    else 
    { 
     up(mutex); 
     down(process's own semaphore); 
     continue; 
    } 
} 


プロセスの概要については、下に来ます。

関連する問題