2012-04-06 16 views
0

スレッドを1〜2マイクロ秒間中断させる方法はありますか? (注1マイクロ秒= 1/1000ミリワット)。私はこの質問が尋ねられたことを知っていますが、これまではこれに対する良い答えはありません。私がこれを必要とする理由は次のとおりです。低遅延スレッド通信のためのWindowsスリープマイクロ秒

クライアントの要求に対応するためにいくつかのスレッドが実行されているサーバーがあります。要求は、時々発生する共有メモリを介して他のスレッドによって送信されます。ただし、要求が送信されるとすぐに処理する必要があります。だから、要求が共有メモリに入れられたときにサービススレッドの1つに通知するための速い方法が必要です。

Windowsイベントオブジェクトが使用されましたが、SetEvent()からWaitForSingleObject()に6〜7秒かかる(プロセス/スレッドの優先順位を設定しようとしましたが、改善はあまりありません)。私はビジーなループを使用して、処理中のスレッドがメモリをプールして待ち時間を1〜2秒に短縮することを試みましたが、それは十分ですが、リクエストが1分に1回しか送られない間CPUを焼き付けます。私がループにマイクロ/ナノ秒の睡眠を挿入することができれば、レイテンシーを低く保ちながら少なくとも私のCPUを無料にすることができます。

2us以下のレイテンシでスレッド通信を行う方法を誰かに教えてもらえれば嬉しいです。ありがとう

+2

この方向には行かないでください。このようなシナリオ(リアルタイムアプリケーションではない)でのこのような睡眠の必要性だけで、IMHOは壊れた設計を示しています。 – Matthias

+0

これは "カーネルリング"でのみ確実に実行できると思います。 –

+0

Bus-waitingを行うための「より安価な方法」であるThread.SpinWait()があります。しかし、_「リクエストは1分に1回だけ送信されます」_は実行しないことを意味します。どのように分単位の状況で問題が発生していますか? –

答えて

0

私はあなたがその期間のスレッドをスリープ状態にすることはできないと思う。

私が最後にテストした(約10年前、Windows 2000の場合)、13ms未満でスリープした結果、0msまたは13msのスリープ状態になりました。

Windowsはリアルタイムオペレーティングシステムではありません。

高解像度タイマーを使用して、その期間のスレッドを回転させることができます。

正直、デザインに欠陥があることをほぼ確実に意味しますが。

私は今投稿を読んだだけです。問題はスレッドモデルです。あなたはワーカープールを持っています。これは本質的にクロススレッド通信を必要とし、これはOSサービスを必要とするので問題である。別の方法として、コア毎に1つのスレッドがあり、スレッド間で対称性があります。彼らはすべてすべてを行い、あなたはそれらの間の負荷を共有します。

関連する問題