【发布时间】:2010-10-30 14:43:04
【问题描述】:
我想知道如何在 C/C++ 中实现信号量、锁和条件变量。我正在学习操作系统概念,但想绕过在 C 中实现这些概念。
有教程吗?
【问题讨论】:
标签: c++ c operating-system
我想知道如何在 C/C++ 中实现信号量、锁和条件变量。我正在学习操作系统概念,但想绕过在 C 中实现这些概念。
有教程吗?
【问题讨论】:
标签: c++ c operating-system
最简单的信号量只是一个计数器,您可以通过单个原子操作对其进行加减运算。维基百科有一个易于理解的解释,几乎涵盖了您对它们的问题:
【讨论】:
您可以了解很多 IPC(进程间通信)书籍,它们可以解释您所需要的内容的来龙去脉。有一本经典的书。 Richard Stevens 的 Unix 网络编程进程间通信。你会得到你需要的一切。 :)
【讨论】:
对于基本的了解,你可以参考Operating System Concepts,Avi Silberschatz、Peter Baer Galvin、Greg Gagne 的书,真的很好。
您也可以访问Dave Marshall's 网站以获得一些支持。请参阅那里的信号量部分。
【讨论】:
在底层,如果你想实现那种东西,你将需要使用汇编语言。 C 和 C++ 根本不公开编写并发代码所需的那种特性——除非使用库,它们在实现中使用汇编程序。
【讨论】:
学习操作系统概念的一个很好的起点可能是 Andrew Tanenbaum 的“现代操作系统”。他还有另一本关于他自己的操作系统(Minix)的书,名为“操作系统:设计与实现”,其中更详细地介绍了编码。您应该可以在当地图书馆找到这些书籍。
您可能需要查找相关主题以了解如何以及为何使用信号量:竞争条件、同步、多线程、消费者-生产者-问题。
【讨论】:
信号量、锁、条件变量等是操作系统概念,通常必须根据操作系统内核的特性来实现。因此,通常不可能孤立地研究它们——您还需要考虑内核代码。可能最好的方法是查看 Linux 内核,并借助诸如 Understanding The Linux Kernel 之类的书。
【讨论】:
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保存在堆栈上。这样就可以摆脱丑陋的东西,而您可以实现信号量/互斥体/计时器等等。挺好玩的。
尽管有些帖子说了什么,但不需要汇编程序。了解它总是有帮助的。在编写高级应用程序时,了解内部/编译器/等的工作原理永远不会有什么坏处。
【讨论】:
有趣的是,史蒂文斯的书是描述同步原语及其用途的经典著作之一。他当然似乎认为它们可以用来控制进程间通信。我倾向于同意他的观点。网络,不,IPC 是。肯定是的。
【讨论】: