怎样才能更好更快地创建关键部分?
使用二进制信号量,介于sem_wait和sem_post之间。
或者原子操作:

#include <sched.h>

void critical_code(){
    static volatile bool lock = false;

    //Enter critical section
    while ( !__sync_bool_compare_and_swap (&lock, false, true ) ){
        sched_yield();
    }

    //...

    //Leave critical section
    lock = false;
}

最佳答案

不管您使用什么方法,代码最糟糕的性能问题与您使用的锁类型无关,而是您锁定的是代码而不是数据。
话虽如此,没有理由像那样把你自己的锁卷起来。如果您想要一个spinlock,可以使用pthread_spin_lock;如果您想要一个在争用时可以屈服于其他进程的锁,可以使用pthread_mutex_locksem_wait(带有二进制信号量)。您编写的代码在使用sched_yield方面是两个世界中最糟糕的。对sched_yield的调用将确保在同时存在锁争用和cpu负载的情况下,锁至少等待几毫秒(可能是整个调度时间片),并且在存在争用但没有cpu负载的情况下(例如,由于锁持有者在IO中被阻塞),锁将消耗100%的cpu。如果你想获得旋转锁的任何好处,你需要在不进行任何系统调用的情况下旋转。如果您想要获得cpu的任何好处,您应该使用一个适当的同步原语,它将使用(在Linux上)的futex(或等效的)操作来精确地获得,直到锁可用为止-不再更短,也不再。
如果这一切碰巧都超出了你的头脑,甚至不要想自己写锁。。

09-05 04:04
查看更多