如果有过Linux编程的经验,基本上每个人都会看到过.o文件,.a文件,.so文件。一直没有认真的去了解过这些文件的区别。这些文件通常会在库文件中看到。比如说C语言的标准库。在任何一台Linux机器中,使用可以使用whereis命令来查找各个库文件的路径。下面是我在WSL中一个例子: 为了保持文章的完整性,我将.o文件也放到这里来一起讲解。 .o文…
Locks(四) 到目前为止,我们来构建并发程序的唯一方法似乎就是使用线程。就像生活中的其他事物一样,这并不是完全对的,在GUI-based程序当中或者一些服务器中,有一种完全不一样的并发模型,叫做基于事件的并发模型(event-based concurrency),在现代的很多系统中十分流行,包括著名的node.js,但是它的根源来自于C/UNI…
Locks (三) 到目前为止,经过前面的两篇文章。我们知道了如何使用锁来完成对临界区的互斥访问,使用条件变量来实现生产者消费者模型。本文将要介绍的是另外一种用于并发编程中的同步原语--信号量(semaphore)。作者是Edsger W. Dijkstra,也是图理论中Dijkstra算法的作者。Dijkstra提出信号量可以实现条件变量和互斥锁…
Locks (二) 到目前为止,我们粗略的知道了锁的实现,也知道了如何使用锁来保证多线程代码的准确性。然而,锁并不是唯一需要来构建并发程序的源语(primitive)。 条件变量 在引入条件变量之前。先设想一个场景,线程在想继续执行之前确认一下某一条件是否已经达到了。比如说父线程来确认子线程是否已经结束(通常使用join()来实现),下面是一种不使…
Locks 本篇想对锁(locks)进行一个比较完整的解释,主要的参考资料是来自《operating system three easy pieces》,以及《深入理解操作系统》(CSAPP)。 问题的引入 对于锁的操作,典型的场景是在多线程编程中。对于代码中的临界区提供原子性的访问(atomic)来对每一个线程操作的同步(syncharonize…