我正在嘗試測量線程調用喚醒睡眠線程時的延遲。由於據說在futex之上開發了許多同步前體物質,我期望futex總是更快。但是,我的測試結果相反。我想知道我是否做錯了什麼,或者它實際上是一個事實。在喚醒線程中,futex如何比互斥體花費更長的時間?
這是我的試驗的細節:
- 過程已設置親和力於特定核
- 時間是通過從RDTSC()返回的指令
- 被創建2個線程的數目進行比較,在其中清醒線程2具有較高的FIFO優先級
線程1通過解鎖互斥體來發送信號,因此線程2應該在下一個時間表中喚醒。 thread1上的sleep(1)用於確保在調用mutex_unlock時,線程2的睡眠等待互斥量。
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宣佈全球。在我的Core i7 930機器上,使用fedora17,互斥量始終比futex快5-10%。測試應用程序由默認設置下的gcc 4.7編譯。任何建議?提前致謝。
您能否提供完整的代碼,包括聲明? – zch
您是否閱讀過http://www.kernel.org/doc/man-pages/online/pages/man7/futex.7.html?它解釋說''futex'系統調用只在競爭中完成....感謝特定的原子組裝指令 –