2011-08-07 3 views
0

私は多くの異なるスレッドが割り当てを要求する共有メモリプールを持っています。これから割り当てを要求すると、すべてのスレッドで多く発生しますが、スレッドの量は少なくなることが多く、1スレッドしか実行されないことがよくあります。私はこれを処理する以下の方法のどれが良いかわからない。共有リソースをロックする方が良いか、または要求を満たすスレッドがある方がいいですか?

最終的に私は両方を実装する必要があるかもしれませんし、どちらがより好ましい結果を生み出すかを見てください...#2の考えでさえも、この共有を使用するコードを実際には持っていないので、まだ書き込まれたリソース。しかし、問題はとても面白いので、それは他の仕事から私をそらす原因となります。

1)ミューテックスを作成し、割り振りを取得する前にスレッドをロックしようとしてからロックを解除します。

2)各スレッドに要求スロットを登録させ、割り当てが必要なときに要求をスロットに入れ、要求スロットに待機するブロック(while(result == NULL){usleep()})結果。単一のスレッドは、割り当てを行う要求スロットを連続的に反復し、それらを要求スロット内の結果に割り当てる。

数字1は簡単な解決策ですが、タイミングが正しい場合は1つのスレッドがロックを奪う可能性があります。 2番目はより複雑ですが、リソースから引き出すときにスレッド間の公平性を保証します。しかし依然として要求スレッドをブロックし、多数のスレッドが存在する場合、反復処理は実行要求を検出するまで実際の割り振りを行わずにサイクルを焼くことができます。

注:pthreadsのに

+0

解決策#2では、結果へのアトミックなアクセスをどのように確保しますか?そして、 'usleep()'のマニュアルページ(引数をとる、BTW)は、呼び出しプロセス*を中断していると言います。 –

+1

マニュアルページが間違っています。スレッドが存在していないか苦いという人が書いただけです。 'usleep'の正しいドキュメントは以下の通りです:http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html –

+0

@R ..古いLinuxのマニュアルページ(linux.dieなど)は間違っています方法。 – cnicutar

答えて

6

ソリューション2を使用してLinux上でCは偽です。これは醜いハックであり、メモリ同期を保証しません。

私は解決策1と言いますが、私はまずは "メモリプール"に言及したという事実にちょっと疑念を抱いています。メモリを割り当てようとしているだけで、管理している他のリソースがありますか(たとえば、特別な種類のメモリ、メモリマップファイル、ビデオメモリのテクスチャなど)?

メモリを割り当てているだけの場合は、時期尚早の最適化が心配されることは全くありません。全体的な問題は時期尚早の最適化であり、システムmallocはメモリプールよりも優れています。 (あなたのコードは、病理学的にいくつかのビデオゲーム機のようなmalloc壊れたといくつかのシステムのいずれかで実行されているかどうか、ちょうどのみが知られている、壊れたシステムに置き換えにドロップします。)

あなたが本当に持っていない場合あなたが管理する必要がある特別なリソースは、ソリューション1から始まり、それがどのように機能するかを見てください。問題がある場合は、スロットを割り当てることができるときにリソースマネージャーが通知する条件変数を使用して改善することができますが、これが必要になるのは本当に疑問です。

関連する問題