【问题标题】:Fast interprocess synchronization method快速进程间同步方法
【发布时间】:2011-01-18 02:08:51
【问题描述】:

我有一块包含一些数据的共享内存。读取/写入这些数据需要在不同进程之间同步。目前我正在使用未命名的 POSIX 信号量。 由于我主要关心的是速度,我想知道信号量在这里是否最佳?它们是否以系统调用(例如用户空间->内核空间)或强制上下文切换结束? 你有什么建议?

关于未命名信号量的一些信息:http://linux.die.net/man/3/sem_init

【问题讨论】:

    标签: posix


    【解决方案1】:

    由于不同的进程具有不同的地址空间,因此任何同步功能都必须通过内核...除非您设法通过一块共享内存进行同步。而你恰好有这么一大块。

    因此,我建议使用位于共享内存块中某个位置的 pthreads 互斥锁(请参阅pthread_mutex_lock())。这将适用于最新的 Linux 系统(glibc-2.3.2 或更高版本,内核 2.6.x)。使用互斥锁时,内核将仅在争用时调用(两个进程竞争同一个锁),在这种情况下,通过内核是正确的做法。

    【讨论】:

    • 位于共享内存空间中的原子变量/自旋锁呢? pthread_mutex 更好吗?
    • 原子变量和自旋锁完成了一半的工作;有时这就足够了。互斥锁以自旋锁开始,但如果锁已经被另一个实体拥有,那么pthread_mutex_lock() 将调用内核等待锁被释放。原始自旋锁通常会以忙等待结束,即在阻塞时使用 CPU。
    • 需要注意的是,默认情况下,pthread 互斥锁“只会由与初始化互斥锁的线程在同一进程中创建的线程操作”。使用 pthread_mutexattr_setpshared (goo.gl/PjHHEI) 更改此行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多