繁体   English   中英

在唤醒线程时,futex如何比互斥体花费更长的时间?

[英]How come a futex take longer than a mutex on waking a thread?

我正在尝试测量线程调用唤醒睡眠线程时的延迟。 由于已经说过许多同步谓词是在futex之上开发的,所以我希望futex总是更快。 但是,我的测试却给出相反的结果。 我想知道我做错了什么还是实际上是事实。

这是我的测试详细信息:

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

线程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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM