例如,我在库C文件中有几个函数,当被调用时应该锁定信号量,并且在将控件返回到被调用者之前,应该释放信号量.没有锁,他们有以下结构:
int f1(int){ ... ... }int f2(char*){ ....}int f3(blabla){ ....}... fn(...)
我想定义一个全局信号量,应该在函数返回之前调用和释放这些函数之前锁定.我想尽可能简单的做到这一点;接近这样的事情
#lockprotectedint f1(int){ ... /* nothing changed over here */}#endlockprotected
或类似的东西
int f1(int){ ... /* nothing changed over here */}#lockprotected f1
我不想要的是:
>更改函数名称,因为它们是库函数,并且正在从许多地方调用.
>在返回调用之前明确地放置任何语句,因为大多数函数之间有很多早期的返回值.或者为了改变任何内部功能.
最优雅的方式是什么?
解决方法 使用RAII(资源获取是初始化)来定义互斥体上的锁定.这将允许您忘记点#2,即您不需要跟踪return语句来释放锁.class Lock {public: Lock () { // acquire the semaphore } ~Lock () { // release the semaphore }}
接下来在函数开始创建这个类的对象,即,
int f1 (int) { Lock l; // forget about release of this lock // as ~Lock() will take care of it}
这方面的一个优点是,即使在从f1()抛出异常的情况下,您仍然不需要担心释放锁.在退出函数之前,所有堆栈对象都将被销毁.
总结以上是内存溢出为你收集整理的如何在C和C中实现装饰器全部内容,希望文章能够帮你解决如何在C和C中实现装饰器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)