1.封装Mutex
1.1 封装前先总结一下常用的mutex操作有:
pthread_mutex_init(&mutex, NULL ); //初始化一个互斥锁
pthread_mutex_destroy(&mutex); //销毁一个互斥锁
pthread_mutex_lock(&mutex); //上锁
pthread_mutex_unlock(&mutex);// 解锁
1.2 用类把这下常用函数进行封装,代码如下,注意编译时不要忘记链接pthread。
#ifndef __MUTEXLOCK_H__ #define __MUTEXLOCK_H__ #include <pthread.h> #include <stdexcept> class Mutexlock{ public: Mutexlock(){ if(pthread_mutex_init(&mutex_, NULL)){ throw std::runtime_error("init mutexlock error"); } } ~Mutexlock(){ if(pthread_mutex_destroy(&mutex_)){ throw std::runtime_error("destroy mutexlock error"); } } void lock(){ if(pthread_mutex_lock(&mutex_)){ throw std::runtime_error("lock muexlock errror"); } } void unlock(){ if(pthread_mutex_unlock(&mutex_)){ throw std::runtime_error("unlock mutexlock error"); } } private: pthread_mutex_t mutex_; }; #endif
2. 封装thread
2.1 thread线程要用的:函数有:
pthread_create(&tid, NULL, pthfunc,NULL);//创建一个线程
pthread_join(&tid); //回收一个线程的资源
pthread_detach(tid); //是系统自动回收线程资源
2.2 类的普通成员函数的函数指针包含类名。例如 void* (Thread::)(void*)。
#ifndef __THREAD_H__ #define __THREAD_H__ #include <pthread.h> class Thread{ public: Thread(); ~Thread(); void start(); static void *thread_func(void *arg); void run(); private: pthread_t tid_; int a_; }; #endif
#include "thread.h" #include <iostream> using namespace std; Thread::Thread() :tid_(-1){ } Thread::~Thread(){ pthread_join(tid_, NULL); } void Thread::start(){ pthread_create(&tid_, NULL, thread_func, this); } void *Thread::thread_func(void *arg){ Thread *pt = static_cast<Thread *>(arg); pt->run(); } void Thread::run(){ cout << "my run " << endl; a_ = 10; cout << "a_ = " << a_ << endl; }
2.3 Thread的封装问题:
a) 函数指针问题,解决方案是使用static方法。
b) 上述方案的缺点是线程中无法访问对象的私有数据。
c) 解决方案是把对象的this指针当做线程参数传入。
3.封装条件变量
3.1条件变量常用的函数有
pthread_cond_init(&empty); //初始化一个条件变量
pthread_cond_wait(&empty, &mutex); //等待某个条件
pthread_cond_signal(&empty);//唤醒一个等待该条件的线程
pthread_cond_broadcast(&empty);//唤醒所有等待该条件的线程
3.2代码
#ifndef __CONDITION_H__ #define __CONDITION_H__ #include <pthread.h> class Mutexlock; //使用类的引用 因此采用前向声明即可 class Condition{ public: Condition(Mutexlock &lock); ~Condition(); void wait(); void notify(); void notifyAll(); private: pthread_cond_t cond_; Mutexlock &lock_; }; #endif #include "condition.h" #include <stdexcept> #include "mutexlock.h" //这里调用了mutexlock中的getMutexptr()函数 因此要加头文件 Condition::Condition(Mutexlock &lock) :lock_(lock) { if(pthread_cond_init(&cond_, NULL) != 0){ throw std::runtime_error("init failed"); } } Condition::~Condition(){ if(pthread_cond_destroy(&cond_) != 0){ throw std::runtime_error("destroy failed"); } } void Condition::wait(){ if(pthread_cond_wait(&cond_, lock_.getMutexptr()) != 0){ throw std::runtime_error("wait failed"); } } void Condition::notify(){ if(pthread_cond_signal(&cond_) != 0){ throw std::runtime_error("signal failed"); } } void Condition::notifyAll(){ if(pthread_cond_broadcast(&cond_) != 0){ throw std::runtime_error("broadcast failed"); } }
0714-----C++Primer听课笔记----------封装mutex,thread,condition等,布布扣,bubuko.com
0714-----C++Primer听课笔记----------封装mutex,thread,condition等
原文地址:http://www.cnblogs.com/monicalee/p/3847532.html