2011-07-20 2 views
1

バッファフルシミュレーションを実行しようとしています。バッファーがいっぱいになったら、それをさらに処理するためにコピーする必要があります。コピーは相互に排他的な操作ですが、それ以上の処理はできません。 私の動作フローはこのようなもので、条件が真であれば何かを書こうとするたびにバッファの完全な状態をチェックします。現在のバッファをコピーします。&それを処理します。&新しいメッセージを書きます。スレッドをQUEUEする方法はありますか?

私は複数の書き込みスレッド&を持っていますが、メッセージは順番にしか書き込まれません。

bwrite(data) 
{ 
    lock(m1); 
    //invoke copy thread 
    lock(m1); 
    // Do write message 
} 

copy(data) 
{ 
//copy the data 
unlock(m1); 
//Do further processing 
} 

に従ってください問題は、コピーが完了したらthread01コピーが最初に私はいけない場合thread01、& thread02が&がある場合、メッセージは例えばのような任意の順序で書かれているということであるとして簡単なの私の機能がありますthread01が最後のメッセージを書き込む前にthread02がコピーを開始する可能性がありますので、メッセージが失われる可能性があります。

私は次の実行シーケンスを保証できるように、基本的には待ち行列に入ってくるスレッドを入れる方法が必要です。

答えて

2

なぜあなただ​​けのスレッドが共有キューに書き込みを持っていないのですか?次に、別のスレッドがキューから要素を1つずつ取り出して書き込むようにすることができます。これにより、キューに入れられた順序と同じ順序で書き込まれることが保証されます。これで、スレッドセーフにするためにキューへのアクセスを同期させるだけで済みます。

+0

実際には、プロジェクト&既存のAPIは既に別の場所に何度も呼び出されていますが、残念ながら変更は許可されていません。 あなたのアプローチは良く見えますが、書き込みが起こっても何のコントロールも持たないので、私はそれについて多くのことをやります。 – vindyz

+0

Hmmm。しかし、あなたはスレッドのコントロールがありますか?私は混乱しています... –

+0

残念なことに、私が制御できるコピースレッドだけです。コピースレッドを呼び出すことができます。書き込みは、プロセスまたはスレッドのいずれかから発生する可能性があります。 – vindyz

関連する問題