簡體   English   中英

在喚醒線程時,futex如何比互斥體花費更長的時間?

[英]How come a futex take longer than a mutex on waking a thread?

我正在嘗試測量線程調用喚醒睡眠線程時的延遲。 由於已經說過許多同步謂詞是在futex之上開發的,所以我希望futex總是更快。 但是,我的測試卻給出相反的結果。 我想知道我做錯了什么還是實際上是事實。

這是我的測試詳細信息:

  • 流程已設置為與特定核心相關
  • 時間與從RDTSC()指令返回的數字進行比較
  • 創建2個線程,其中喚醒線程2具有更高的FIFO優先級

線程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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM