临界资源互斥问题?

作者站长头像
站长
· 阅读数 7

两个或多个并行运行的程序怎么保证临界资源互斥问题?感觉peterson算法可能会导致多个进程都无法访问临界资源的情况,有没有大佬给解释一下,像windows或Linux这些操作系统是如何处理的呢?谢谢

回复
1个回答
avatar
test
2024-06-30

题主的问题可以转化为 “多进程或多线程竞争条件问题”

这块的方案推荐一个网站 OSChina,上面有很丰富的资料

回到问题中,现在有很多成熟的方案

比如 windows 通过

  • 临界区( Critical Section ):它是一种保护共享资源免受并发访问的机制。通过将代码块标记为临界区,在任意时刻只有一个线程可以进入该代码块,并访问其中的共享资源。
  • 互斥体( Mutex ):与 Peterson 算法类似,互斥体也是一种二进制信号量,用于实现对共享资源的互斥访问。Windows 中提供了名为 CreateMutex、WaitForSingleObject 和 ReleaseMutex 的函数来创建和操作互斥体。
  • 事件( Event ):事件是一种同步对象,用于线程间通信和控制流程。Windows 中提供了两种类型的事件对象:自动重置事件和手动重置事件。通过等待(wait)和设置(set)或者复位(reset)事件状态,线程可以进行协调操作。
  • 信号量(Semaphore):信号量是一种计数器对象,用于控制对共享资源的访问数量。Windows 提供了 CreateSemaphore、WaitForSingleObject 和 ReleaseSemaphore 等函数来创建和操作信号量。

linux 通过

  • 互斥体( Mutex ):与 Windows 中的互斥体类似,不赘述了
  • 条件变量( Condition Variable ):条件变量用于线程间的等待通知机制。通过等待条件变量,并在满足特定条件时发送信号唤醒等待线程。Linux 中提供了 pthread_cond_t 类型和相关函数来实现条件变量。
  • 读写锁( Read-Write Lock ):读写锁是一种特殊类型的锁,允许多个线程同时对共享资源进行读操作,但只允许一个线程进行写操作。通过使用读写锁可以提高并发性能。Linux 提供了 pthread_rwlock_t 类型和相关函数来实现读写锁。
参考【操作系统】 信号量机制 OSChina使用互斥体防止程序多开技术 OSChinaLinux条件变量 OSChina
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容