这将是开发工程师的梦魇!
那么如何解决呢?C++利用了一个非常好的特性:当一个对象初始化时自动调用构造函数,当一个对象到达其作用域结尾时,自动调用析构函数。所以我们可以利用这个特性解决锁的维护问题:把锁封装在对象内部!此时,在构造函数时获得锁,在语句返回前自动调用析构函数释放锁。
其实这种做法有个专有的名称,叫做RAII(Resource Acquisition Is Initialization)
二、C++封装互斥锁
使用上文直接的方法有一个非常好的特性:高效。
那么锁对象有哪些好处呢?
- 对包含多个返回点的复杂子程序的维护。
- 从异常中恢复
- 锁操作的多态
- 日志记录的多态。
那么锁对象有哪些坏处呢?
为了解决锁的维护问题(提高了性能),可我们不得不使用面向对象的设计,增加了对象的创建与销毁的开销。
因此,我们下一步的目的是尽量减少它的开销(内联通常是一种补救办法,减少函数调用的开销。)。
利用锁对象可以提供C++新增的强大功能,同时不损失效率。为了验证这个假设,我们测试了三种互斥锁的实现:
- 直接调用pthread_mutex_lock()和pthread_mutex_unlock()
- 不从基类继承的独立互斥对象。
- 从基类派生的互斥对象。
#include <iostream>
#include <ctime>
#include <pthread.h>
using namespace std;
//版本2:锁类,构造函数加锁,析构函数解锁
//用c++简单的封装线程中互斥锁
class SimpleMutex {
public:
SimpleMutex(pthread_mutex_t& lock) :myLock(lock) { acquare(); }
~SimpleMutex() { release(); }
p


356

被折叠的 条评论
为什么被折叠?



