2013-01-16 43 views
2

我正在嘗試測量線程調用喚醒睡眠線程時的延遲。由於據說在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編譯。任何建議?提前致謝。

+0

您能否提供完整的代碼,包括聲明? – zch

+0

您是否閱讀過http://www.kernel.org/doc/man-pages/online/pages/man7/futex.7.html?它解釋說''futex'系統調用只在競爭中完成....感謝特定的原子組裝指令 –

回答

1

基於互斥量的互斥鎖實現不會爲任何鎖定/解鎖操作執行系統調用,但僅在需要時執行。

當您用無條件futex系統調用替換互斥鎖/解鎖時,它需要更慢。

+0

謝謝。我知道系統調用在某些情況下可能不需要互斥鎖/解鎖操作,但我測試的目的是關注喚醒*睡眠*線程所需的時間。在這種情況下,我相信一些系統調用應該要求內核在互斥量實現中釋放一個線程。如果互斥體確實建立在futex之上,那麼futex_wake的系統調用很可能會用於其解鎖操作。 – Codeblue

+0

也許'系統調用'不通過VDSO ....? –

相關問題