chromium中MessageLoop指针的实现
来源:互联网 发布:tf卡写入数据错误 编辑:程序博客网 时间:2024/05/19 13:18
和许多客户端程序一样,chromium中同样使用到了多线程,每个线程可能包括一个消息循环MessageLoop,它通过调用current函数返回,因为MessageLoop是线程的私有数据,线程内共享而线程间不共享,这就使用到了线程局部存储(Thread Local Storage,TLS)技术。TLS技术在不同的操作系统中通过不同的系统调用实现,它为线程提供一种保存私有数据的方法,使线程的私有数据对其它线程不可见。chromium通过定义模版类ThreadLocalPointer实现线程私有的数据指针。以下是ThreadLocalPointer的实现
template <typename Type>class ThreadLocalPointer { public: ThreadLocalPointer() : slot_() { internal::ThreadLocalPlatform::AllocateSlot(&slot_); } ~ThreadLocalPointer() { internal::ThreadLocalPlatform::FreeSlot(slot_); } Type* Get() { return static_cast<Type*>( internal::ThreadLocalPlatform::GetValueFromSlot(slot_)); } void Set(Type* ptr) { internal::ThreadLocalPlatform::SetValueInSlot( slot_, const_cast<void*>(static_cast<const void*>(ptr))); } private: typedef internal::ThreadLocalPlatform::SlotType SlotType; SlotType slot_; DISALLOW_COPY_AND_ASSIGN(ThreadLocalPointer<Type>);};
对于不同的操作系统,TLS的实现方式并不相同,所以在实现过程中定久了接口类ThreadLocalPlatform,它定义了TLS的一些基本操作,对于不同的操作系统,只需要对接口进行实现就可以了。例如,在windows下的实现为:
void ThreadLocalPlatform::AllocateSlot(SlotType* slot) { *slot = TlsAlloc(); CHECK_NE(*slot, TLS_OUT_OF_INDEXES);}// staticvoid ThreadLocalPlatform::FreeSlot(SlotType slot) { if (!TlsFree(slot)) { NOTREACHED() << "Failed to deallocate tls slot with TlsFree()."; }}// staticvoid* ThreadLocalPlatform::GetValueFromSlot(SlotType slot) { return TlsGetValue(slot);}// staticvoid ThreadLocalPlatform::SetValueInSlot(SlotType slot, void* value) { if (!TlsSetValue(slot, value)) { LOG(FATAL) << "Failed to TlsSetValue()."; }}
在实现中可以看出,当 ThreadLocalPointer构造的时候,由操作系统分配出一个slot_,通过slot_可以取出保存和读取特定的数据,在 ThreadLocalPointer中,这个数据的类型就是一个指针。
这样说明还是很不容易理解TLS的原理,其实可以理解成操作系统为每一个线程都分配了一个大小相同的数组TLS_ARRAY,当调用TlsAlloc时,系统遍历所有的线程,找到一个slot_,在所有线程中TLS_ARRAY[slot_]都为空,slot_值就相当于一个索引保存下来。当某一个线程要设置私有数据时,操作系统会根据slot_值找到线程私有的数据TLS_ARRAY[slot_],用户可以设置它的值或者调取它的值。
当ThreadLocalPointer析构的时候,会调用TlsFree释放slot_,这是所有数据中TLS_ARRAY[slot_]的值都置为了空。
- chromium中MessageLoop指针的实现
- chromium messageloop
- Chromium MessageLoop类分析
- Chromium 智能指针实现
- Chromium和WebKit的智能指针实现原理分析
- Chromium VideoCapture的实现
- [Chrome源码阅读] MessageLoop类的点点滴滴
- chromium设置UI的实现
- Chromium原码浅析 --- Chromium多线程的实现
- Chromium源码浅析 --- MessagePort通信的实现
- Chromium的智能指针/引用计数/Callback/Bind
- chromium中脚本执行的代码路径
- chromium工程中一些有用的trick
- chromium 中添加flash的位置
- chromium中FTP网络资源的加载
- chromium中HTTP网络资源的加载过程
- chromium中FTP网络资源的加载
- chromium 57 中有趣的代码
- EasyUI 兼容 IE6 方法总结
- 解决hibernate向mysql插入中文乱码问题
- 动态规划总结
- Redis和memcached
- 日语学习之沪江整理 20141027
- chromium中MessageLoop指针的实现
- LVS-DR工作原理图文详解
- struts2如何实现文件上传
- 单片机破解的常用方法及应对策略
- Ognl的底层用法
- 学习数据库分表和分库思想
- 在Ubuntu 14.04下安装Google拼音输入法,
- mfc英文网站
- R:一般矩阵运算