2012-01-20 6 views
2

私はLinuxでpthreadを使用しています。あるスレッドから別のスレッドにデータを渡す循環バッファがあります。循環バッファーはここで使用するのに最適な構造ではないかもしれませんが、それを変更しても問題は解決しないので、単にキューとして参照します。スレッドの競合下で待機する最速のメソッド

キューが満杯か空であるときはいつでも、pop/push操作はNULLを返します。私のスレッドは定期的に起動するので、これは問題です。別のスレッドループを待つのは時間がかかります。

私はセマフォ(sem_post、sem_wait)を使用しようとしましたが、競合の下でロックを解除するにはループの速度と同じ約25ミリ秒かかります。私はpthread_cond_tで待機しようとしましたが、ロック解除には10〜15ミリ秒がかかります。

データを待つために使用できるより速いメカニズムがありますか?

EDIT *

いいえ条件変数を使用しました。私は組み込み機器に搭載されているので、「より多くのコアまたはCPUパワー」を追加することはオプションではありません。これにより私はすべてのスレッドの優先順位を全面的に設定していたので、これを先に並べ替える前に並べ替えるようにしました。

+2

これらの同期機能をひどく悪用するか、その種類の時間を見つけるために行動をひどく誤って評価する必要があります。条件変数はあなたができる最高のものであり、事実上瞬間的です。どのようにそれらを使用していますか、おそらくもっと重要なのは、どのように測定していますか? –

+0

ロックを解除する前と後の両方で、clock_gettime(CLOCK_REALTIME、&time)を使用しています – Eric

+0

I/Oを実行して同じ行/関数呼び出しで終了時刻を取得していますか? –

答えて

4

条件変数を使用してください。唯一のより高速な方法はプラットフォーム固有であり、それらはほんのわずかしか高速ではありません。

スレッドのスケジュールが解除されているため、パフォーマンスが低下していると思われます。あなたのスレッドがタイムスライスの終わりに近づいているときに、長い「遅延」があり、スケジューラーは、ブロックされていないスレッドが実行中のスレッドを先取りできるようにしています。スレッドよりコア数が多い場合やスレッドの優先順位を高く設定した場合、これらの遅延は表示されません。

しかし、これらの遅延は実際には良いことであり、それらについては心配するべきではありません。他のスレッドでも実行できるチャンスがあります。

+1

25ms?それは単純なロックのために非常に長いです... –

+1

期間はロックとは関係ありません。ロックは、ミリ秒の最初の部分で解放されました。他の時間は、システムが他のことをしていたためスレッドが実行されていない時間でした。 –

+0

Davidさんの+1 - ボックスがオーバーロードされています。より多くのコア、(おそらくはRAM)、CPU集約型のアプリケーションを必要としません。また、Billy-25usの+1も、決してロック解除のためには長すぎます。 –

関連する問題