どのようにスレッドの寝未満のミリ秒Windows
質問
Windowsしていま問題になったUnix.ではどのようにスレッドの寝未満のミリ秒Unixでは、通常、多数の選択肢(睡眠usleepとnanosleep)を合、さらにお得な価格でのご提供.Windowsしかし、限りあり 睡眠 ミリ秒粒度.
Unixでは、使用できます使用の select
システムコールをマイクロ秒の眠りなのですが、ここでは素直なものです:
int usleep(long usec)
{
struct timeval tv;
tv.tv_sec = usec/1000000L;
tv.tv_usec = usec%1000000L;
return select(0, 0, 0, 0, &tv);
}
どのように私達と同じWindows?
解決 18
Windowsでの利用 select
力に基づいていますの Winsock 図書館を初期化する必要があり,このようなお申し込み:
WORD wVersionRequested = MAKEWORD(1,0);
WSADATA wsaData;
WSAStartup(wVersionRequested, &wsaData);
その選択許さないのではないでしょうおと呼ばれるようなソケットだから、ちょっとしたよりを作るマイクロスリープ法
int usleep(long usec)
{
struct timeval tv;
fd_set dummy;
SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
FD_ZERO(&dummy);
FD_SET(s, &dummy);
tv.tv_sec = usec/1000000L;
tv.tv_usec = usec%1000000L;
return select(0, 0, 0, &dummy, &tv);
}
これらすべて作成されusleepのメソッドがゼロの場合の成功に非ゼロにします。
他のヒント
このことを示し、誤解の眠ります。パラメータを渡すには 最小 時間眠っている間にやってきました。あのスレッドが起きた後の時間を指定します。このスレッドdon'wake up'の全てがなされ実行に提供します。のスケジューラーが選べるのを待り要求された睡眠時間、起動するスレッドが別のスレッドがまだアクティブである。
としてのジョエルとのできない有意義'眠り'(返却予定のCPU用などの短います。したい場合は遅延は一部を短時間ば、スピン、繰り返し確認の適切な高分解能タイマーなどの性能タイマー')という高い優先なの未然防止す。
かつ精度の遅延などの短い時代を用いてはいけません。
利用の高分解能タイマーをご用意winmm.lib.見 この のための一例です。
ありが必要理規定"を制定するとともに、OSの時代quantums.Windowsんでもすることで知られている1ms解像度の時代などたくさんの時間量を1ms.(例えばtimeBeginPeriod()/timeEndPeriod())ともなう保証はあります。少しでも荷重のものや友達にデバイスドライバをスローしますか。
SetThreadPriority()すが、非常に危険です。不良デバイスドライバが破滅します。
必要な超制御コンピューティング環境を作ること醜いものです。
#include <Windows.h>
static NTSTATUS(__stdcall *NtDelayExecution)(BOOL Alertable, PLARGE_INTEGER DelayInterval) = (NTSTATUS(__stdcall*)(BOOL, PLARGE_INTEGER)) GetProcAddress(GetModuleHandle("ntdll.dll"), "NtDelayExecution");
static NTSTATUS(__stdcall *ZwSetTimerResolution)(IN ULONG RequestedResolution, IN BOOLEAN Set, OUT PULONG ActualResolution) = (NTSTATUS(__stdcall*)(ULONG, BOOLEAN, PULONG)) GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwSetTimerResolution");
static void SleepShort(float milliseconds) {
static bool once = true;
if (once) {
ULONG actualResolution;
ZwSetTimerResolution(1, true, &actualResolution);
once = false;
}
LARGE_INTEGER interval;
interval.QuadPart = -1 * (int)(milliseconds * 10000.0f);
NtDelayExecution(false, &interval);
}
yesでも非正規滞在カーネル機能で非常に使っているSleepShort(0.5);一部のthreds
したい場合な粒度の違ったもの(ユーザ)。
してくださいユーザ空間のお時間は必ずしも精度の向上を図っています。
のスケジューラのスタートスレッド(アプリ)、スケジュールなどによっては、OSを提供します。
くものを精密にす:1)カーネル空間のようにドライバー) 2)を選択可能です
とにかく一部の粒度が覚えている問題をユーザ空間)を見る QueryPerformanceCounter機能QueryPerformanceFrequency機能にMSDN.
として複数の人を指摘の通り、睡眠やその他の関連機能のデフォルトの"スティック".これは、最小単位の時間をOSに実スケジュールの、実行されませんよ。でもリアルタイムOSのシステムの目盛は、通常の1以下です。では波長可変、この影響は、全体のシステムだけでなく、お客様の快眠機能のために、スケジューするとともに、より頻繁に、潜在的に高架のOS(時間のスケジューラ実行、時間の課題である。
そこでは外部の高速クロック装置です。Unixシステムをご指定をタイマーなどの異なるクロックとして使用することに反対するデフォルトのシステムクロックです。
あけましておめでとうございま待つ必要とするなどの精密?一般の場合 必要 指定したレベルの精度などのために依存したり外部ハードウェア)で、間違いーすべきであるリアルタイムOSとなる。
そのお考えがあればイベントの同期が可能ですが、やはり悪い場合で忙しいお待ち、CPUの高性能カウンターのAPIを計測する経過時間。
一般的には眠る前の少なくともまで、次のシステム割り込みが発生します。しかし、この
により設定のマルチメディアタイマー。で設定に近いものになる
1ms、ハードウェアも可能での走行を中断期間0.9765625(ActualResolution による NtQueryTimerResolution
ま0.9766が実際に間違っています。うになる~叡智の扉は正しい番号を ActualResolution 形式です。で0.9765625ms1024割り込みたりして変更することができます。
ある一つの例外が既に可能であることから逃れらができなくなる可能性がある眠りのために以下の割り込み期間:あの有名な Sleep(0)
.これは非常に強力な
ツールで使用しないという!で放棄し、残りのスレッドの時間になります。このスレッドが停止までのスケジューラの勢力は、スレッドの取得cpuを有するものとする。 Sleep(0)
である非同期サービスの迫力のスケジューラへの対応を自社の独自.
第二の方法での使用 waitable object
.待ちのような機能 WaitForSingleObject()
できるのを待ちます。するためにスレッドに寝て、また、マイクロ秒の領域では、スレッドのニーズ設定のサービスの一部のスレッドを生成するイベントを希望する。の"眠り"のスレッドの設定このスレッドを一時停止の待機能までのサービスのスレッドがセットにイベントナ.
このスレッドで眠り""もしくは待ちます。本サービスのスレッドの大きな複雑さでご提供システム全体でのサービス時間イベントでのマイクロ秒分解能でしかし、マイクロ秒分解能力にサービスのスレッドをスピンの高分解能時間サービスで中断期間(~1ms).場合において行われるよう、 も柔らかさがマルチプロセッサーまたはマルチコアシステム。一msのスピンは傷つかない大幅なマルチコアシステムの場合、親のマスクの呼び出し側スレッドのスレッドが慎重に扱っている。
コード、説明、および試験訪問することができる Windowsのタイムスタンプをプロジェクト
私は同じ問題というより、msであっても、睡眠(0)です。私の問題コミュニケーションとクライアントとサーバアプリケーションが使用し_InterlockedExchange機能試験設定のビットおよびその後の睡眠(0)です。
ズっぽい大人な雰囲気を何千もの操作りこのように、うまくいきませんでした。
そしてシンクライアントのユーザーは、ソッドを呼び出し代理人にその話をスレッドについてお話したいと思いますすぐにマネジメントのスレッドのようなイベントのインターフェースが必要となります。
すいアイデアなどこの睡眠行った試験のための10秒間で行空のループとしては、のようなもの18,000,000ループ)が、イベント会場できませんでした180,000ルです。それは、100倍になっ!
実際にこのusleep機能の原因になりますので大きなメモリ資源を漏らすことになります。によってどと呼ばれる)
この修正済みバージョンへアップデー(編集できません?)
bool usleep(unsigned long usec)
{
struct timeval tv;
fd_set dummy;
SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
FD_ZERO(&dummy);
FD_SET(s, &dummy);
tv.tv_sec = usec / 1000000ul;
tv.tv_usec = usec % 1000000ul;
bool success = (0 == select(0, 0, 0, &dummy, &tv));
closesocket(s);
return success;
}
のように全てが実に保証しません睡眠時間を。ないと認める時には、アイドルシステムのusleepコマンドは非常に精度の向上を図っています。特にticklessを含んでいます。Windows Vistaで、Linuxにおいては、で2.6.16.
Ticklessカーネルが存在する向上のためのノートパソコンbatterly寿命:c.f.インテルのpowertopる。
この状態で、私は満足してい測定は、Linuxのusleepコマンドを尊重要求された睡眠時間は非常に密接、半ダースのマイクロ秒です。
では、その国のOPいう約作業のほとんどの時間、アイドリングシステムを聞くことができるためのマイクロ秒ケジューリング!私は実際にしているWindowsます。
また睡眠(0)という力::スレッド::利回りは、用語がより明確である。
のだろうか Boostタイミングでロックしています。めることができロックミューテックスといっスリリースがタイムアウトに達したも...タイムアウト設定と向上::system_time+ブー::ミリ秒&cie(xtimeが推奨されていません).
使ってみ SetWaitableTimer...
み力::xtime、timed_wait()
はナノ秒の正確性。
さん、睡眠(0)です。0は以下のと解釈されます現在では、この音を愉していると思う。睡眠(0)かがいながいいの見直しのスケジューラーの運行。以来、このスレッドできない予定の実行前にスケジューラ自体が、これは最短遅延が可能です。
注意のことで渡すことができます、マイクロ秒数におusleepものではvoid usleep(__int64t){Sleep(t/1000);}-無保証、実際に寝る。
睡眠る機能は以下の都度、ミリ秒か
これらの睡眠(0)勤務しました。システムに近0%負荷時のcpuタスクマネージャーに書いて、簡単なコンソールプログラムの睡眠(0)機能眠のための一貫した1-3マイクロ秒単位で、この方法は以下のと解釈されます
だから、上記の回答がこのスレッドをもたらすであろうと確信してお額sleep(0)睡眠で異なりの激しいこのシステム上で大きなcpuの負荷を高めます。
していましたが、もともとの理解では、睡眠の機能を必要として使用することはできませんのタイマー.して使用する必要があるプログラムの使用は少なくとも割合のcpuで実行が可能です。私の目的を動かすなど、プロの画面にゲームをより早くよりピクセルは、ミリ秒、睡眠(0)作品になると思います。
すばかりだく睡眠の間隔はより小さく、時間がいります。使わないの睡眠としてタイマーが、ゲーム用の最小限のcpuの割合が可能です。を使うのに別の機能に関係のない素泊まりんが特定の時間が経過した後に、飛一ピクセルの画面でも1/10のミリ秒または100マイクロ秒単位.
の擬似コードがこれ。
while (timer1 < 100 microseconds) {
sleep(0);
}
if (timer2 >=100 microseconds) {
move projectile one pixel
}
//Rest of code in iteration here
私の答えは動作しない場合があり高度な課題又はプログラムが仕事の一部または多くのプログラム.
の場合は "待つのでは非常に短時間で" いこなしているということ spinwait, に対してのレベルの上昇を待つまでも見ることができる状態です。
void SpinOnce(ref Int32 spin)
{
/*
SpinOnce is called each time we need to wait.
But the action it takes depends on how many times we've been spinning:
1..12 spins: spin 2..4096 cycles
12..32: call SwitchToThread (allow another thread ready to go on time core to execute)
over 32 spins: Sleep(0) (give up the remainder of our timeslice to any other thread ready to run, also allows APC and I/O callbacks)
*/
spin += 1;
if (spin > 32)
Sleep(0); //give up the remainder of our timeslice
else if (spin > 12)
SwitchTothread(); //allow another thread on our CPU to have the remainder of our timeslice
else
{
int loops = (1 << spin); //1..12 ==> 2..4096
while (loops > 0)
loops -= 1;
}
}
その目標は、実際に待 みょ, きのようなもの:
int spin = 0;
while (!TryAcquireLock())
{
SpinOne(ref spin);
}
仁徳ここでお待ちしておりますの長は、毎回、最終的にうっとります。