Android Native 同步类
2015-09-17 14:51
477 查看
先来看互斥Mutex
再看Autolock
Condition类和java中的wait,notify功能类似,只是java封装在了object中了。
Condition在调wait的时候,必须在锁的中间。而且wait的时候和java一样也会将所持的锁释放。
下面看一个例子:
class Mutex { enum { PRIVATE = 0, SHARED = 1}; Mutex(); Mutex(const char* name); Mutex(int type, const char* name = NULL); ~Mutex(); status_t lock(); void unlock(); status_t tryLock(); }
再看Autolock
class Autolock { public: inline Autolock(Mutex& mutex) : mLock(mutex) { mLock.lock(); } inline Autolock(Mutex&* mutex) : mLock(*mutex) {mLock.lock();} inline ~Autolock() { mLock.unlock(); } private: Mutex& mLock; }
Condition类和java中的wait,notify功能类似,只是java封装在了object中了。
Condition在调wait的时候,必须在锁的中间。而且wait的时候和java一样也会将所持的锁释放。
class Condition { public: enum { PRIVATE = 0, SHARED = 1 }; Condition(); Condition(int type);//如果type是SHARED,表示支持跨进程的条件同步 ~Condition(); //线程B和C等待事件,wait这个名字是不是很形象呢? status_t wait(Mutex& mutex); //线程B和C的超时等待,B和C可以指定等待时间,当超过这个时间,条件却还不满足,则退出等待。 status_t waitRelative(Mutex& mutex, nsecs_t reltime); //触发者A用来通知条件已经满足,但是B和C只有一个会被唤醒。 void signal(); //触发者A用来通知条件已经满足,所有等待者都会被唤醒。 void broadcast();
下面看一个例子:
class Barrier { public: inline Barrier() : state(CLOSED) { }//state就是所谓的“条件” inline ~Barrier() { } void open() { Mutex::Autolock _l(lock); state = OPENED; cv.broadcast(); } void close() { Mutex::Autolock _l(lock); state = CLOSED; } void wait() const { Mutex::Autolock _l(lock);//临时对象_l,用lock来构造,在AutoLock的构造函数里已给lock加锁(调用lock()函数)——该wait()函数执行完毕,会自动释放lock(这个场景会使得其他线程再次修改state,产生不安全因素。不过由于Barrier的使用场景的特殊性,其用在线程初始化时,故OK。) while (state == CLOSED) {//while语句:不断轮询,直到state==OPENED cv.wait(lock); } } private: enum { OPENED, CLOSED }; mutable Mutex lock;//持有一个互斥锁 mutable Condition cv;//持有一个条件变量 volatile int state;//每次都从内存更新的“条件” };
相关文章推荐
- Android 一些常用的但是记不住的设置
- android ProgressDialog 提示窗口 代码
- Android 上千张图片的列表滑动加载
- 实战操作ADB命令
- 轻松学习android百度地图开发(三)
- Android jni开发资料--NDK环境搭建
- Android软键盘弹出时把布局顶上去的解决方法
- android studio Gradle: 警告:编码 GBK 的不可映射字符的 ...
- Android 语音识别+语音搜索源码 Voice Search
- Android左右摇摆动画,开始动画,结束动画
- Android模块化编程之引用本地的aar
- android listview仿iphone弹簧特效
- Android选择本地图片或者照片裁剪
- Android Scroller类的详细分析
- Android实现系统下拉栏的消息提示——Notification
- 【android学习笔记】 android.os.NetworkOnMainThreadException错误
- Android实现系统下拉栏的消息提示——Notification
- Android视频图片缩略图的获取
- Android Data Storage(数据存储)值External Storage
- Android 用EditText加一个ImageButton自定义一个带clear的搜索框