尝试在C++里实现 Java 的 synchronized 关键字
2014-04-03 15:55
519 查看
话说Java里有个很强大的关键字叫synchronized,可以方便的实现线程同步。下面来尝试下在C++里模拟一个类似的。
Java里的synchronized有两种形式,一种是基于函数的,另种则是语块的。前者受C++的语法所限,估计是没法实现了,所以就尝试后者。
块级语法很简单:
因为Java所有变量都继承于Object,所以任意变量都能当作锁用。这在C++里无法简易实现,因此我们用特定的类型实例当作同步变量使用。
先从最经典简易的同步类说起。
这是windows下实现线程同步最常见的封装。只需声明一个Lock实例,在需要同步的代码前后分别调用Enter和Leave即可。
既然用起来这么简单,为什么还要继续改进?显然这种方法有个很大的缺陷,如果忘了调用Leave,或者在调用之前就return/throw退出,那么就会引起死锁。
所以,我们需要类似auto_ptr的机制,自动维护栈数据的创建和删除。就暂且称它_auto_lock吧。
_auto_lock通过引用一个Lock实例来初始化,并立即锁住临界区;被销毁时则释放锁。
有了这个机制,我们再也不用担心忘了调用.Leave()。只需提供一个Lock对象,就能在当前语块自动加锁解锁。再也不用担心死锁的问题了。
进入syn code的"{"之后,_auto_lock被构造;无论用那种方式离开"}",析构函数都会被调用。
上述代码类似的在stl和boost里都是及其常见的。利用栈对象的构造/析构函数维护局部资源,算是C++很常用的一技巧。
我们的目标又近了一步。下面开始利用经典的宏定义,制造一颗synchronized语法糖,最终实现这样的语法:
显然需要一个叫synchronized宏,并且在里面定义_auto_lock。
乍一看这语法很像循环,并且要在循环内定义变量,所以用for(;;)的结构是再好不过了。
不过sync code我们只需执行一次,所以还需另一个变量来控制次数。由于for里面只能声明一种类型的变量,所以我们在外面再套一层循环:
synchronized宏将mylock替换成上述代码,既没有违反语法,也实现相同的流程。得益于循环语法,甚至可以在synchronized内使用break来跳出同步块!
我们将上述代码整理下,并做个简单的测试。
使用语法糖除了好看外,有个最重要的功能就是可以在synchronized同步块里使用break来跳出,并且不会引起死锁,这是其他方法无法实现的。
Java里的synchronized有两种形式,一种是基于函数的,另种则是语块的。前者受C++的语法所限,估计是没法实现了,所以就尝试后者。
块级语法很简单:
先从最经典简易的同步类说起。
既然用起来这么简单,为什么还要继续改进?显然这种方法有个很大的缺陷,如果忘了调用Leave,或者在调用之前就return/throw退出,那么就会引起死锁。
所以,我们需要类似auto_ptr的机制,自动维护栈数据的创建和删除。就暂且称它_auto_lock吧。
有了这个机制,我们再也不用担心忘了调用.Leave()。只需提供一个Lock对象,就能在当前语块自动加锁解锁。再也不用担心死锁的问题了。
上述代码类似的在stl和boost里都是及其常见的。利用栈对象的构造/析构函数维护局部资源,算是C++很常用的一技巧。
我们的目标又近了一步。下面开始利用经典的宏定义,制造一颗synchronized语法糖,最终实现这样的语法:
我们将上述代码整理下,并做个简单的测试。
相关文章推荐
- 尝试在C++里实现 Java 的 synchronized 关键字
- 尝试在C++里实现 Java 的 synchronized 关键字
- 尝试在C++里实现 Java 的 synchronized 关键字
- c++实现java synchronized关键字
- Java synchronized 关键字的实现原理
- Java中synchronized关键字实现同步(二)
- Java中利用synchronized关键字实现多线程同步问题
- Java中利用synchronized关键字实现多线程同步问题 .
- 在C++中实现类似Java的“synchronized”
- java中synchronized关键字实现线程同步互斥(一)
- java同步关键字Synchronized 的实现原理
- Java中使用synchronized关键字实现简单同步操作示例
- C++如何实现类似JAVA中加了FINAL关键字的类
- java中synchronized关键字的实现
- java中synchronized关键字的实现
- Java的synchronized关键字:同步机制总结
- C/C++在Java项目、Android和Objective-C三大平台下实现混合编程
- Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用
- JNA实现Java调用C++动态链接库
- 第三次实现Logistic Regression(c++)_再尝试