[英]How come a futex take longer than a mutex on waking a thread?
我正在尝试测量线程调用唤醒睡眠线程时的延迟。 由于已经说过许多同步谓词是在futex之上开发的,所以我希望futex总是更快。 但是,我的测试却给出相反的结果。 我想知道我做错了什么还是实际上是事实。
这是我的测试详细信息:
线程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.