我正在尝试测量线程调用唤醒 sleep 线程时的延迟。既然已经说过许多同步谓词是在futex之上开发的,所以我希望futex总是更快。但是,我的测试却给出相反的结果。我想知道我做错了什么还是实际上是事实。
这是我的测试详细信息:
已将
创建了
Thread1通过解锁互斥锁来发送信号,因此Thread2应该在下一个计划中唤醒。线程1上的sleep(1)是为了确保线程2在调用mutex_unlock时处于等待互斥的 sleep 状态。
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的互斥体实现不对任何锁定/解锁操作执行syscall,而仅在需要时执行。
当您用无条件futex syscall替换互斥锁/解锁时,速度会变慢。
关于c - 在唤醒线程时,futex如何比互斥体花费更长的时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14365288/