【问题标题】:Implementing Semaphores, locks and condition variables实现信号量、锁和条件变量
【发布时间】:2010-10-30 14:43:04
【问题描述】:

我想知道如何在 C/C++ 中实现信号量、锁和条件变量。我正在学习操作系统概念,但想绕过在 C 中实现这些概念。

有教程吗?

【问题讨论】:

    标签: c++ c operating-system


    【解决方案1】:

    最简单的信号量只是一个计数器,您可以通过单个原子操作对其进行加减运算。维基百科有一个易于理解的解释,几乎涵盖了您对它们的问题:

    http://en.wikipedia.org/wiki/Semaphore_(programming)

    【讨论】:

      【解决方案2】:

      您可以了解很多 IPC(进程间通信)书籍,它们可以解释您所需要的内容的来龙去脉。有一本经典的书。 Richard Stevens 的 Unix 网络编程进程间通信。你会得到你需要的一切。 :)

      【讨论】:

      • 信号量、锁和条件变量不是进程间通信机制,与网络无关。
      • 是的,我知道并同意你的观点,但只是提到它作为所提到主题的参考书,这是值得的,请看看那本书 :)
      【解决方案3】:

      对于基本的了解,你可以参考Operating System ConceptsAvi Silberschatz、Peter Baer Galvin、Greg Gagne 的书,真的很好。

      您也可以访问Dave Marshall's 网站以获得一些支持。请参阅那里的信号量部分。

      【讨论】:

        【解决方案4】:

        在底层,如果你想实现那种东西,你将需要使用汇编语言。 C 和 C++ 根本不公开编写并发代码所需的那种特性——除非使用库,它们在实现中使用汇编程序。

        【讨论】:

          【解决方案5】:

          学习操作系统概念的一个很好的起点可能是 Andrew Tanenbaum 的“现代操作系统”。他还有另一本关于他自己的操作系统(Minix)的书,名为“操作系统:设计与实现”,其中更详细地介绍了编码。您应该可以在当地图书馆找到这些书籍。

          您可能需要查找相关主题以了解如何以及为何使用信号量:竞争条件、同步、多线程、消费者-生产者-问题。

          【讨论】:

            【解决方案6】:

            信号量、锁、条件变量等是操作系统概念,通常必须根据操作系统内核的特性来实现。因此,通常不可能孤立地研究它们——您还需要考虑内核代码。可能最好的方法是查看 Linux 内核,并借助诸如 Understanding The Linux Kernel 之类的书。

            【讨论】:

              【解决方案7】:

              minix 的东西很不错。一个更简单的例子是 MicroC/OS 的东西。它带有一本详细的教科书,所有来源都在那里。它有基本的元素,而且代码足够小,你可以在相对较短的时间内理解它。

              http://www.micrium.com/products/rtos/kernel/rtos.html

              http://en.wikipedia.org/wiki/MicroC/OS-II

              您可以做的另一件事是在 linux 上的应用程序中制作伪造的操作系统。我通过使用计时器设置基本滴答来做到这一点,然后使用函数调用swapcontext(man 2 swapcontext)交换线程,这将把regs保存在堆栈上。这样就可以摆脱丑陋的东西,而您可以实现信号量/互斥体/计时器等等。挺好玩的。

              尽管有些帖子说了什么,但不需要汇编程序。了解它总是有帮助的。在编写高级应用程序时,了解内部/编译器/等的工作原理永远不会有什么坏处。

              【讨论】:

                【解决方案8】:

                有趣的是,史蒂文斯的书是描述同步原语及其用途的经典著作之一。他当然似乎认为它们可以用来控制进程间通信。我倾向于同意他的观点。网络,不,IPC 是。肯定是的。

                【讨论】:

                  猜你喜欢
                  • 2011-07-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-03-01
                  • 1970-01-01
                  • 2011-03-31
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-10-18
                  相关资源
                  最近更新 更多