c - 实现临界区

标签 c multithreading gcc atomic critical-section

有什么方法可以更好更快地创建临界区?

在 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;
}

最佳答案

无论您使用什么方法,代码最糟糕的性能问题与您使用的锁类型无关,而是您锁定的是代码而不是数据。

话虽如此,没有理由像那样滚动自己的自旋锁。如果你想要一个自旋锁,要么使用 pthread_spin_lock,要么使用 pthread_mutex_locksem_wait(使用二进制信号量)竞争时的其他过程。您编写的代码在使用 sched_yield 方面是两全其美。对 sched_yield 的调用将确保锁在同时存在锁争用和 cpu 负载的情况下至少等待几毫秒(可能是整个调度时间片),并且它会在以下情况下消耗 100% 的 cpu存在争用但没有 CPU 负载(例如,由于锁持有者在 IO 中被阻塞)。如果你想获得自旋锁的任何好处,你需要在不进行任何系统调用的情况下进行自旋。如果你想获得 cpu 的任何好处,你应该使用适当的同步原语,它将使用(在 Linux 上)futex(或等效的)操作来精确地产生直到锁可用 - 不更短,不再。

如果碰巧所有这些都让你头疼,甚至不要考虑编写自己的锁..

关于c - 实现临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9066990/

相关文章:

c - 如何使用 C 套接字正确发送数据和管理进程

c - 我正在编写一个关于更改制作的蛮力算法,但我有点卡住了

c - 无法修复内存泄漏

c - 在代码中使用 turboboost 测量 CPU 频率

php - ajax多线程

c++ - 分离线程执行结束

java - SwingWorker线程即使任务完成也没有关闭?

c++递归没有明显原因退出

python - 如何解决dyld : Symbol not found - Expected in:/usr/lib/libSystem. B.dylib(_fdopendir $ INODE64)

c++ - 给定一个源文件,有没有办法让 gcc 只返回直接包含的头文件列表?