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

这是我的测试详细信息:

已将

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

  • 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/

    10-10 12:36