我正在尝试测量线程调用唤醒睡眠线程时的延迟。由于据说在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'系统调用只在竞争中完成....感谢特定的原子组装指令 –