包装器外观模式:把现有的非面向对象/面向对象API提供的函数和数据(例如底层操作系统API、基础类)封装在更加简洁使用的、健壮的、可维护的和聚合的面向对象的类接口之内,如线程同步对象的包装;
#ifdef LINUX_PTHREADS
#include <pthread.h>
#include <semaphore.h>
#define MUTEX_PTR_DECLARE pthread_mutex_t*
#define MUTEX_LOCK(mutex) pthread_mutex_lock(mutex)
#define MUTEX_UNLOCK(mutex) pthread_mutex_unlock(mutex)
#elif defined(WIN32_THREADS)
#include <windows.h>
#define MUTEX_PTR_DECLARE CRITICAL_SECTION*
#define MUTEX_LOCK(mutex) EnterCriticalSection(mutex)
#define MUTEX_UNLOCK(mutex) LeaveCriticalSection(mutex)
#endif
class Guard
{
public:
Guard(MUTEX_PTR_DECLARE mutex): _mutex (mutex)
{
MUTEX_LOCK( _mutex );
}
~Guard()
{
MUTEX_UNLOCK( _mutex );
}
private:
MUTEX_PTR_DECLARE _mutex;
// disable copy
Guard(const Guard&);
Guard& operator=(const Guard&);
}
因此经过上述封装包装后,在函数内使用同步机制时,不管函数的返回路径有多少条,都不需要在每条返回路径上去释放同步对象了,只要在需要使用同步机制的地方构造Guard对象即可,因为Guard对象在析构时自动回释放同步对象。这样就大大减少了出错的机会了。
原文链接: https://www.cnblogs.com/appsucc/archive/2012/11/08/2760396.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/68580
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!