私は多くの異なるスレッドが割り当てを要求する共有メモリプールを持っています。これから割り当てを要求すると、すべてのスレッドで多く発生しますが、スレッドの量は少なくなることが多く、1スレッドしか実行されないことがよくあります。私はこれを処理する以下の方法のどれが良いかわからない。共有リソースをロックする方が良いか、または要求を満たすスレッドがある方がいいですか?
最終的に私は両方を実装する必要があるかもしれませんし、どちらがより好ましい結果を生み出すかを見てください...#2の考えでさえも、この共有を使用するコードを実際には持っていないので、まだ書き込まれたリソース。しかし、問題はとても面白いので、それは他の仕事から私をそらす原因となります。
1)ミューテックスを作成し、割り振りを取得する前にスレッドをロックしようとしてからロックを解除します。
2)各スレッドに要求スロットを登録させ、割り当てが必要なときに要求をスロットに入れ、要求スロットに待機するブロック(while(result == NULL){usleep()})結果。単一のスレッドは、割り当てを行う要求スロットを連続的に反復し、それらを要求スロット内の結果に割り当てる。
数字1は簡単な解決策ですが、タイミングが正しい場合は1つのスレッドがロックを奪う可能性があります。 2番目はより複雑ですが、リソースから引き出すときにスレッド間の公平性を保証します。しかし依然として要求スレッドをブロックし、多数のスレッドが存在する場合、反復処理は実行要求を検出するまで実際の割り振りを行わずにサイクルを焼くことができます。
注:pthreadsのに
解決策#2では、結果へのアトミックなアクセスをどのように確保しますか?そして、 'usleep()'のマニュアルページ(引数をとる、BTW)は、呼び出しプロセス*を中断していると言います。 –
マニュアルページが間違っています。スレッドが存在していないか苦いという人が書いただけです。 'usleep'の正しいドキュメントは以下の通りです:http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html –
@R ..古いLinuxのマニュアルページ(linux.dieなど)は間違っています方法。 – cnicutar