【问题标题】:What is POSIX's equivalent of Win32's Mutex?POSIX 相当于 Win32 的 Mutex 是什么?
【发布时间】:2011-06-13 23:40:42
【问题描述】:

POSIX 的mutex 等同于Win32 的CRITICAL_SECTION——它的范围仅限于单个进程。 Win32 的互斥体(实际上在 NT 领域称为“突变体”)用作跨进程锁定机制。 pthreads 的跨进程锁等价物是什么?

【问题讨论】:

  • CRITICAL_SECTION 更接近于pthread_spinlock_t,互斥量将是WaitForSingleObject/ReleaseMutexpthread_mutex_t
  • @Steve-o:这两者有什么区别?据我(尽管有限)理解,关键部分和互斥锁之间的唯一区别是一个在单个进程内,而另一个是跨进程。那么posix自旋锁和posix互斥锁有什么区别呢?
  • @Billy:这个答案可能会有所帮助,自旋锁忙等待,互斥锁产生stackoverflow.com/questions/195853/spinlock-versus-semaphore
  • @Steve-o:关键部分产量。
  • @Billy:您可以将其设置为不在多处理器系统上:msdn.microsoft.com/en-us/library/ms683476(v=vs.85).aspx

标签: c pthreads


【解决方案1】:

这是一个 pthread_mutex_t ,其 pshared 属性设置为 PTHREAD_PROCESS_SHARED 。但是,您有责任在共享内存中放置这样一个互斥体,所有进程都可以访问 - 所以它不像 win32 api 那样简单。

也许更接近 win32 的是posix 或 sysv 信号量。传统上,跨进程的同步也是使用文件锁来完成的,例如羊群或lockf(这绝不像听起来那么慢)

【讨论】:

  • 范围不只适用于线程吗?您只能将pthread_attr_t 传递给pthread_create。您需要将pthread_mutexattr_tpthread_mutex_init 一起使用。
  • 你是对的,这是你需要的 pthread_mutexattr 的 pshared
  • 你有关于锁的缓慢(或缺乏)的链接吗?我搜索了更多细节,但没有发现任何有趣的东西。我们有一个包含大量共享文件的大型项目,我怀疑由于锁存在一些性能问题,但我不知道如何找出答案。
  • 使用基于文件系统的锁每次锁定或解锁操作需要 5000-20000 个周期;无论是否存在争用,都会产生系统调用开销。使用互斥锁,除非存在争用,否则唯一的开销是 CPU 的内存同步损失。对于很少使用的锁,使用lockf 可能是可以接受的,但对于任何面向性能的东西,忘记它。
  • 谢谢R。比这更糟糕的是因为文件映射到内存中并通过内存操作进行修改。我不敢想象内核必须做什么来检测文件锁定部分的修改。
【解决方案2】:

您应该将 IPC 用于跨进程操作:管道、信号量、消息队列或共享内存。 我认为在你的情况下命名信号量会很好。欲了解更多信息:

man 7 sem_overview

【讨论】:

  • 我确实想使用共享内存。但是仍然需要一种方法来对该共享内存执行锁定。
  • sem_init() 可用于对共享内存执行锁定。
  • 忘记这些无用的信号量的东西。创建一个共享内存对象,然后在其中创建一个 pshared 互斥体。
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 2010-09-30
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
相关资源
最近更新 更多