時間の期限をマークするrdts
-
22-08-2019 - |
質問
私はこのような「聞こえる」というコードを持っています
スレッド1
now = rdtsc();
for_each_member_in_a_list {
if ( member_in_list.deadline() <= now ) {
do_something;
}
}
スレッド2
now = rdtsc();
for_each_member_in_a_list {
member_in_list.updatedealine( foo(now, ...) );
}
これはSMPシステムで、今、過去には良い仕事をしていた間、意図したとおりに今、このコードは動作しません。私はCLOCK_MONOTONICとにclock_gettimeを使用すると思いますが、私は最初に耳に他のいくつかのヒントをしたいと思います。
解決
理論的にはTSCは、マザーボード上のすべてのCPUの間でsyncronisedする必要がありますが、それはありませんいくつかのSMPシステムでは、マザーボードメーカーを非難します。また、一部の古いチップ上TSCは、それが潜在的に非常に信頼性のない作りCPUの電源状態を変更するようです。 clock_gettime(CLOCK_MONOTONIC)は、より信頼性の高いですが、より多くのオーバーヘッドが(それはSYSTEMCALLです)持っていますが、はるかにこれを行うための最善の方法である。
私はまた、あなたのデータ構造をロックしていると仮定します)。
所属していません StackOverflow