Linux学习之互斥量的封装一:封装创建(pthread_mutex_init)和销毁(pthread_mutex_destroy)...

本节的源程序基于"Linux学习之线程封装四:基于接口的封装"一节。

增加了封装的互斥量类"CLMutex"(互斥量的创建封装进构造函数,销毁封装进析构函数,还结合CLLog类增加了错误处理)。

头文件:

ContractedBlock.gif ExpandedBlockStart.gif View Code
#ifndef CLMutex_H
#define CLMutex_H

#include <pthread.h>
#include "CLStatus.h"

class CLMutex
{
public:
/*
构造函数和析构函数出错时,会抛出字符串类型异常
*/
CLMutex();
virtual ~CLMutex();

CLStatus Lock();
CLStatus Unlock();

private:
CLMutex(const CLMutex&);
CLMutex& operator=(const CLMutex&);

private:
pthread_mutex_t m_Mutex;
};

#endif

实现:

ContractedBlock.gif ExpandedBlockStart.gif View Code
#include "CLMutex.h"
#include "CLLog.h"

CLMutex::CLMutex()
{
int r = pthread_mutex_init(&m_Mutex, 0);
if(r != 0)
{
CLLog::WriteLogMsg("In CLMutex::CLMutex(), pthread_mutex_init error", r);
throw "In CLMutex::CLMutex(), pthread_mutex_init error";
}
}

CLMutex::~CLMutex()
{
int r = pthread_mutex_destroy(&m_Mutex);
if(r != 0)
{
CLLog::WriteLogMsg("In CLMutex::~CLMutex(), pthread_mutex_destroy error", r);
throw "In CLMutex::~CLMutex(), pthread_mutex_destroy error";
}
}

CLStatus CLMutex::Lock()
{
int r = pthread_mutex_lock(&m_Mutex);
if(r != 0)
{
CLLog::WriteLogMsg("In CLMutex::Lock(), pthread_mutex_lock error", r);
return CLStatus(-1, 0);
}
else
{
return CLStatus(0, 0);
}
}

CLStatus CLMutex::Unlock()
{
int r = pthread_mutex_unlock(&m_Mutex);
if(r != 0)
{
CLLog::WriteLogMsg("In CLMutex::Unlock(), pthread_mutex_unlock error", r);
return CLStatus(-1, 0);
}
else
{
return CLStatus(0, 0);
}
}

调用:

ContractedBlock.gif ExpandedBlockStart.gif View Code
#include <iostream>
#include "CLThread.h"
#include "CLExecutiveFunctionProvider.h"
#include "CLMutex.h"

using namespace std;

struct SPara
{
int Flag;
CLMutex mutex;
};

class CLMyFunction : public CLExecutiveFunctionProvider
{
public:
CLMyFunction()
{
}

virtual ~CLMyFunction()
{
}

virtual CLStatus RunExecutiveFunction(void *pContext)
{
SPara *p = (SPara*)pContext;

p->mutex.Lock();

p->Flag++;

p->mutex.Unlock();

return CLStatus(0, 0);
}
};

int main()
{
CLExecutiveFunctionProvider *myfunction = new CLMyFunction();
CLExecutive *pThread = new CLThread(myfunction);

SPara *p = new SPara;
p->Flag = 3;

pThread->Run((void *)p);

p->mutex.Lock();

p->Flag++;
cout << p->Flag << endl;

p->mutex.Unlock();

pThread->WaitForDeath();

delete p;

delete pThread;
delete myfunction;

return 0;
}

简化了一定的操作。

转载于:https://www.cnblogs.com/lq0729/archive/2011/10/21/2220579.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值