首页 › 月度存档 › 十月 2015

俗话说,俗话又说。。。笑死我了

俗话说:好马不吃回头草
可俗话又说:浪子回头金不换

俗话说:兔子不吃窝边草
可俗话又说:近水楼台先得月

俗话说:宰相肚里能撑船
可俗话又说:有仇不报非君子
继续阅读 »

OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)

一. 引子

最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程、线程、互斥等,就拿以前学过的 OS 问题开开刀啦。记得当年学读者写者问题,尤其是写者优先的时候,那是真心纠结啊。刚才还觉得理解了,过一会儿又糊涂了。现在重新再看,还是容易纠结。没办法,用得少。我把读者优先和写者优先都实现了一下。选择性重看了小部分《unix高程》使用了多线程+互斥量实现。

二. 互斥量与信号量

互斥量如其名,同一时间只能被一个线程占有,实现线程间对某种数据结构的互斥访问。试图对一个已经加锁的互斥量加锁,会导致线程阻塞。允许多个线程对同一个互斥量加锁。当对互斥量解锁时,阻塞在该互斥量上的线程会被唤醒,它们竞争对该互斥量加锁,加锁成功的线程将停止阻塞,剩余的加锁失败于是继续阻塞。注意到,谁将竞争成功是无法预料的,这一点就类似于弱信号量。(强信号量把阻塞在信号量上的进程按时间排队,先进先出)
继续阅读 »

OS: 生产者消费者问题(多线程+互斥量+条件变量)

一. 引子

用多进程解决生产着消费者问题之后,再尝试多线程方法,才知道多线程多么地方便。多线程方案的易用性,一方面得益于强大的条件变量。赞,太好用了!

二. 思路

互斥量实际上相当于二元信号量,它是纯天然适合生产者消费者问题的解决方案,使用互斥量可以很好地描述生产者或者消费者独占缓冲区的特点。
不过互斥量的能力也仅此而已,如果需要在使用线程方案时提供更复杂的逻辑,则需要配合使用条件变量。生产者要求在缓冲区不满的情况下才能生产,我用 notFull 条件变量表示这种情况;消费者要求在缓冲区不空的情况下才能消费,我用 notEmpty 条件描述这种情况。
继续阅读 »

OS: 生产者消费者问题(多进程+共享内存+信号量)

一. 引子

时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然基本忘光了。趁着有大把时间,再把生产者消费者问题巩固一下,用纯C吧。珍惜能写代码的幸福时光。

二. 分析

生产者和消费者问题是多个相互合作的进程之间的一种抽象。生产者和消费者之间的关系:
1.  对缓冲区的访问是互斥的。由于两者都会修改缓冲区,因此,一方修改缓冲区时,另一方不能修改,这就是互斥。
2.  一方的行为影响另一方。缓冲区不空,才能消费,何时不空?生产了就不空;缓冲区满,就不能生产,何时不满?消费了就不满。这是同步关系。
为了描述这种关系,一方面,使用共享内存代表缓冲区;另一方面,使用 互斥信号量 控制对缓冲区的访问,使用同步信号量描述两者的依赖关系。
继续阅读 »

让用VS2012/VS2013编写的程序在XP中顺利运行

微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序只能在Vista/Win7/Win8上运行。但幸好还保留了生成XP程序的设置项。XP和Win2003的用户还是大量存在的,我们程序软件的发布不能不考虑他们。

1. 项目菜单->项目属性->配置属性->常规->平台工具集,选择“VS2013WindowsXP(v120_xp)”;

2. 项目菜单->项目属性->配置属性->常规->MFC的使用,选择在静态库中使用MFC;

3. 项目菜单->项目属性->链接器->系统->子系统->控制台或窗口windows(根据你的项目类型选择),第二项版本号设成5.01。

4. C/C++->代码生成->运行库,选择“多线程调试(/MTd)”;

5. 还需要至少带有Update3(或4),这一点我没有验证,因为我直接安装的就是带有Update3的VS2013。
继续阅读 »

变参函数的实现

相对于固定参数的函数,变参函数的可用性无疑是更好的。我们最常用的变参函数包括scanf和printf。刚刚接触到变参函数的时候,我觉得这太神奇了,它并不知道我要输入什么类型的数据,要输入多少个数据,却能完美地处理。其实,可变参数机制实现起来是相当容易的(在stdarg.h的基础上),而且,它的作用并没有想象中的那么神奇。
继续阅读 »