2

我试图测量线程调用唤醒睡眠线程时的延迟。既然有人说许多同步指令是在 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 在默认设置下编译。有什么建议吗?提前致谢。

4

1 回答 1

1

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

当你用无条件的 futex 系统调用替换互斥锁/解锁时,它需要更慢。

于 2013-01-16T18:50:59.507 回答