2013-01-16 40 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 ....? –

相关问题