跨平台进程间同步是件令人内牛满面的事情:进程间同步少不了使用内核级别的同步机制,所以与操作系统的关系太紧密了。windows的内核对象有个特点:当引用计数为0时自动回收。linux下的同步机制则表现得像文件。如果进程运行一切正常当然OK,但是如果进程crash了呢?windows下很简单,关闭所有进程,然后重启,OK。linux下也很简单,关闭所有进程,删除文件,然后重启,OK。但问题是两者不完全一致……
在网上搜索了些跨平台进程库。大部分库做到了外观一致,但是行为不一致。boost的interprocess库比较有意思,他费了很多心思,终于做到行为基本一致——方法是在windows平台下使用内存映射文件来持久化同步信息,也就是说在windows下模拟linux。但是问题是我觉得windows的方式更简单啊:比如使用进程mutex来同步两个进程,如果持有mutex进程crash了,另一个进程应该能够自动获得该mutex,第一个进程重启后也可以再次获取该mutex。但事实上为了恢复状态,你必须关闭所有进程,然后干掉那个文件。当然作者这么做很容易理解:linux平台下模仿windows难度太大了哈。