实现信号量,锁和条件变量

时间:2009-06-02 07:24:32

标签: c++ c operating-system

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

任何教程?

8 个答案:

答案 0 :(得分:7)

信号量,锁,条件变量等是操作系统概念,通常必须根据操作系统内核的功能来实现。因此通常不可能单独研究它们 - 您也需要考虑内核代码。执行此操作的最佳方法可能是在Understanding The Linux Kernel等书的帮助下查看Linux内核。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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

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

您可以做的另一件事是在Linux上的应用程序中伪造一个操作系统。我通过使用itimer设置基本tick来完成此操作,然后使用函数调用swapcontext(man 2 swapcontext)交换线程,这将保存堆栈上的reg。这会让丑陋的东西挡开,你就可以实现信号量/互斥量/定时器了。这很有趣。

尽管有些帖子说,但不需要汇编程序。了解它总是有帮助的。在编写高级应用程序时,理解内部/编译器/等等是如何工作的,这绝非易事。

答案 5 :(得分:1)

基本了解,您可以参考由Avi Silberschatz,Peter Baer Galvin,Greg Gagne 撰写的书Operating System Concepts,并且非常好。

您还可以访问Dave Marshall's网站获取一些支持。请参阅那里的Semaphore部分。

答案 6 :(得分:1)

有趣的是,Stevens Book是描述同步原语及其用途使用的经典文本之一。他当然认为他们可以用来控制进程间的通信。我倾向于同意他的观点。网络,不,IPC是的。肯定是的。

答案 7 :(得分:-2)

您可以了解很多IPC(进程间通信)书籍,这些书籍可以解释您需要的内容。有一本经典书。理查德史蒂文斯的Unix网络编程进程间通信。你会得到你所需要的一切。 :)