C++之MutexLock和MutexLockGuard封装
noncopyable.h
#ifndef __WD_NONCOPYABLE_H__
#define __WD_NONCOPYABLE_H__ namespace wd
{ class Noncopyable
{
protected:
Noncopyable(){}
~Noncopyable(){}
private:
Noncopyable(const Noncopyable&);
Noncopyable & operator=(const Noncopyable &);
}; }//end of namespace wd #endif
thread.h
#ifndef __WD_MUTEXLOCK_H__
#define __WD_MUTEXLOCK_H__
#include "Noncopyable.h"
#include <pthread.h>
namespace wd
{ class MutexLock
:public Noncopyable //表达语义
{
public:
MutexLock()
{ pthread_mutex_init(&_mutex, NULL); } ~MutexLock()
{ pthread_mutex_destroy(&_mutex); } void lock()
{ pthread_mutex_lock(&_mutex);} void unlock()
{ pthread_mutex_unlock(&_mutex);} pthread_mutex_t * getMutexLockPtr()
{ return &_mutex; } private:
pthread_mutex_t _mutex;
}; //RAII
class MutexLockGuard
{
public:
MutexLockGuard(MutexLock & mutex)
: _mutex(mutex)
{ _mutex.lock(); } ~MutexLockGuard()
{ _mutex.unlock(); } private:
MutexLock & _mutex;
}; }//end of namespace wd #endif
thread.cc
#include "Thread.h"
#include <iostream> using std::cout;
using std::endl;
using namespace wd; Thread::Thread()
: _pthid(0)
, _isRunning(false)
{} void Thread::start()
{
pthread_create(&_pthid, NULL, threadFunc, this);
_isRunning = true;
} void * Thread::threadFunc(void * arg)
{
Thread * pthread = static_cast<Thread*>(arg);
if(pthread)
pthread->run();// 执行任务 return NULL;
} void Thread::join()
{
pthread_join(_pthid, NULL);
_isRunning = false;
} Thread::~Thread()
{
if(_isRunning)
{
pthread_detach(_pthid);// 将运行的线程交给系统进行托管
_isRunning = false;
}
}
testThread.cc
#include "Thread.h" #include <unistd.h>
#include <stdlib.h>
#include <iostream>
#include <memory>
using std::cout;
using std::endl;
using std::unique_ptr; class MyThread
: public wd::Thread
{
void run()
{
::srand(::time(NULL));
int cnt = 10;
while(cnt--) {
int number = ::rand() % 100;
cout << ">> Thread "<< pthread_self() << " get a number : " << number << endl;
::sleep(1);
}
}
}; int main(void)
{
cout << "MainThread: " << pthread_self() << endl;
unique_ptr<wd::Thread> myThread(new MyThread());//线程对象在主线程
myThread->start();
myThread->join(); return 0;
}
C++之MutexLock和MutexLockGuard封装的更多相关文章
- C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard
互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源. C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用 ...
- 基于线程池、消息队列和epoll模型实现并发服务器架构
引言 并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进 ...
- Linux多线程服务端编程:使用muduo C++网络库
内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这 ...
- Mudo C++网络库第二章学习笔记
线程同步的精要 并发有两种基本的模型: 一种是message passing(消息传递); 另一种是shared memory(共享内存); 在分布式系统中(有多台物理机需要通信), 运行在多台机器上 ...
- 我要好offer之 C++大总结
0. Google C++编程规范 英文版:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml 中文版:http://zh-g ...
- Linux多线程服务器端编程
目录 Linux多线程服务器端编程 线程安全的对象生命期管理 对象的销毁线程比较难 线程同步精要 借shared_ptr实现写时拷贝(copy-on-write) 多线程服务器的适用场合与常用编程模型 ...
- muduo源码解析5-mutex相关类
mutexlock和mutexlockguard class mutexlock:noncopyable { }: class mutexlockguard:noncopyable { }: 作用: ...
- muduo网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点
一.MutexLock 类 class MutexLock : boost::noncopyable 二.MutexLockGuard类 class MutexLockGuard : bo ...
- Linux组件封装(四)使用RAII技术实现MutexLock自动化解锁
我们不止一次写过这种代码: { mutex_.lock(); //XXX if(....) return; //XXX mutex_.unlock(); } 显然,这段代码中我们忘记了解锁.那么如何防 ...
随机推荐
- java 匿名类和匿名方法
package com.test; interface product{ int getPrice(); } public class News { /** * @param args */ publ ...
- sharepoint 2013 资源管理器copy大文件到本地失败解决方法
Error 0x800700DF: The file size exceeds the limit allowed and cannot be saved 中文错误信息是:文件大小超出同意范围.不能被 ...
- RRDTool详解(转)
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.http://freeloda.blog.51cto.com/2033581/1307492 大纲 ...
- 目标跟踪之camshift---opencv中meanshift和camshift例子的应用
在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...
- iOS中对于多个按钮,选中其中一个,其他按钮选中状态为NO
第一,定义一个全局的按钮变量 /** * 按钮选中,中间值 */ @property (nonatomic,strong) UIButton *selectedBtn; 第二,添加多个按钮到sc ...
- share初始化
要看懂share先看与map的交互以及跨地图的交互 share初始化 void Share::ShareInit(I_DataLayer* data_layer) { // 加载xls表 if(!Lo ...
- 【BZOJ4281】[ONTAK2015]Związek Harcerstwa Bajtockiego LCA
[BZOJ4281][ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后 ...
- Leslie Lamport
http://lamport.azurewebsites.net/pubs/pubs.html paper
- 高德地图API开发二三事(一)如何判断点是否在折线上及引申思考
最近使用高德地图 JavaScript API 开发地图应用,提炼了不少心得,故写点博文,做个系列总结一下,希望能帮助到LBS开发同胞们. 项目客户端使用高德地图 JavaScript API,主要业 ...
- Hadoop基础学习(一)分析、编写并执行WordCount词频统计程序
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jiq408694711/article/details/34181439 前面已经在我的Ubuntu ...