[英]How come a futex take longer than a mutex on waking a thread?
我正在嘗試測量線程調用喚醒睡眠線程時的延遲。 由於已經說過許多同步謂詞是在futex之上開發的,所以我希望futex總是更快。 但是,我的測試卻給出相反的結果。 我想知道我做錯了什么還是實際上是事實。
這是我的測試詳細信息:
線程1通過解鎖互斥鎖來發送信號,因此線程2應該在下一個計划中喚醒。 線程1上的sleep(1)是為了確保線程2在調用mutex_unlock時處於等待互斥的睡眠狀態。
void *Thread1(void *dummy)
{
while(1)
{
pthread_mutex_lock( &mutx );
sleep(1);
t1 = rdtsc();
pthread_mutex_unlock( &mutx );
pthread_yield();
}
return NULL;
}
void *Thread2(void *dummy)
{
while(1)
{
pthread_mutex_lock( &mutx );
t2 = rdtsc();
if(t1>0)
{
// print out the result
cout << t2-t1 << endl;
t1 = 0;
}
pthread_mutex_unlock( &mutx );
pthread_yield();
}
return NULL;
}
通過用futex系統調用替換互斥鎖,可以完成類似的測試:
void *Thread1(void *dummy)
{
while(1)
{
sleep(1);
t1 = rdtsc();
syscall(SYS_futex, &futx, FUTEX_WAKE, 1);
pthread_yield();
}
return NULL;
}
void *Thread2(void *dummy)
{
while(1)
{
syscall(SYS_futex, &futx, FUTEX_WAIT, 0);
t2 = rdtsc();
if(t1>0)
{
cout << t2-t1 << endl;
t1 = 0;
}
pthread_yield();
}
return NULL;
}
mutx和futx都聲明為全局。 在裝有fedora17的Core i7 930機器上,互斥鎖始終比futex喚醒快5-10%。 測試應用程序是在默認設置下由gcc 4.7編譯的。 有什么建議嗎? 提前致謝。
基於互斥體的基於Futex的實現不會對任何鎖定/解鎖操作執行系統調用,而只會在需要時執行。
當您用無條件futex syscall替換互斥鎖/解鎖時,速度會變慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.