gpt4 book ai didi

c - 为什么 futex 在唤醒线程时比 mutex 花费更长的时间?

转载 作者:太空狗 更新时间:2023-10-29 12:34:53 28 4
gpt4 key购买 nike

我试图测量线程调用以唤醒休眠线程时的延迟。由于据说许多同步原语是在 futex 之上开发的,我希望 futex 总是更快。但是,我的测试给出了相反的结果。我想知道我是否做错了什么,或者这实际上是事实。

这是我的测试的详细信息:

  • 进程已设置为特定核心的亲和性
  • 时间与RDTSC()指令返回的数字进行比较
  • 创建2个线程,其中唤醒线程2具有更高的FIFO优先级

线程 1 正在通过解锁互斥量发送信号,因此线程 2 应该在下一个时间表中唤醒。线程 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 都声明为全局的。在我的 Core i7 930 机器上,使用 fedora17,mutex 始终比 futex 唤醒快 5-10%。测试应用程序由 gcc 4.7 在默认设置下编译。有什么建议吗?提前致谢。

最佳答案

互斥锁的基于 Futex 的实现不会为任何锁定/解锁操作执行系统调用,仅在需要时才执行。

当你用无条件的 futex 系统调用替换 mutex 锁定/解锁时,它必须更慢。

关于c - 为什么 futex 在唤醒线程时比 mutex 花费更长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14365288/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com