我试图测量线程调用唤醒睡眠线程时的延迟。既然有人说许多同步指令是在 futex 之上开发的,我希望 futex 总是更快。但是,我的测试给出了相反的结果。我想知道我是否做错了什么,或者这实际上是一个事实。
这是我的测试的详细信息:
- 进程已被设置为与特定核心的亲和性
- 时间与 RDTSC() 指令返回的数字进行比较
- 创建了2个线程,其中唤醒线程2具有更高的FIFO优先级
Thread1 通过解锁互斥锁来发送信号,因此 Thread2 应该在下一个计划中唤醒。thread1 上的 sleep(1) 是为了确保 thread2 在调用 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 系统调用替换 mutex 来完成类似的测试:
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,mutex 的唤醒速度始终比 futex 快 5-10%。测试应用程序由 gcc 4.7 在默认设置下编译。有什么建议吗?提前致谢。