Chromium中多线程及并发技术要点(C/C++)
2017-07-27 18:56 tlnshuju 阅读(1103) 评论(0) 编辑 收藏 举报类别 | 类 | 说明 | 演示样例 | |
---|---|---|---|---|
线程机制 | Thread | (參考:线程模型及应用指南) | ||
MessagePump | ||||
MessageQueue | ||||
SequencedWorkerPool | 它是一个线程池,用于运行须要串行运行的任务请求,这些请求根据不同的Token分组,仅仅在同样组内保证运行顺序。 这样多个组能够并行运行,而单个组则是串行运行。比方:不同实例所相应的分组不同。或者不同的功能相应不同的分组。 它同一时候同意指定当退出时未运行的任务怎样处理,包含:继续运行,忽略,阻止退出。 | |||
并发控制机制 | volatile | 语言基于处理器提供的特性。 保证各个线程读数据时为最新的值。 但它的使用须要掌握一定的技巧。 | ||
Atomic32 (base/atomicops.h) AtomicSequenceNumber (base/atomic_sequence_num.h) AtomicRefCountXxx (base/atomic_ref_count.h) | Chromium提供的原子数据类型。 | |||
AutoLock AutoUnlock Lock (base/synchronization/lock.h) | 非常接近于Java的Synchronized。Lock和AutoLock非常好理解。 AutoUnlock的行为 与AutoLock类似,建构时release lock, 在析构时acquire lock. *应用了RAII idiom。 | cookie_manager.cc *AutoUnlock的演示样例: media/filters/audio_renderer_impl.h | ||
WaitableEvent (base/synchronization/waitable_event.h) | 以异步的调用完毕操作,在调用端以一个WaitableEvent等待任务完毕. 基于Lock + ConditionVariable实现。 | |||
ConditionVariable (base/synchronization/condition_variable.h) | 条件变量的C/C++实现。主要方法: Wait TimeWait BroadCast Singal | InProcessCommandBuffer | ||
CancellationFlag (base/synchronization/cancellation_flag.h) | 基于原子操作。提供一个布尔值标志的设定和查询。 | |||
WTF提供的机制 | atomicXXX (wtf/Atomics.h) | WebKit提供的原子类 | ||
Mutex (wtf/TreadingPrimitives.h) | 相互排斥量的实现 (对平台化的抽象) 和base中的Lock系列类似。 | Mutex m_mutex; { ...... } | ||
MutexLock (wtf/TreadingPrimitives.h) | ||||
RecursiveMutex (wtf/TreadingPrimitives.h) | ||||
MutexTryLocker (wtf/TreadingPrimitives.h) | ||||
ThreadCondition (wtf/TreadingPrimitives.h) | 条件变量的实现 | |||
并发容器 | ThreadLocalBoolean ThreadLocalPointer (base/threading/thread_local.h) | TLS (Thread Local Stoage) 的实现 | 在ThreadRestrictions中有ThreadLocal的应用: LazyInstance<ThreadLocalBoolean>::Leaky g_io_disallowed = LAZY_INSTANCE_INITIALIZER; | |
ThreadSafeDataTransport (wtf/ThreadSafeDataTransport.h) | 以线程安全的方式在一对生产者和消费者之间利用SharedBuffer传递数据。降低线程冲突和数据拷贝。 | ImageFrameGenerator.h 很多其它的说明 | ||
LazyInstance | 函数中静态成员初始化不是线程安全的,easy出现隐患 (C++11已经声称能够保证)。能够使用base::LazyInstance()来解决, 同一时候LazyInstance能够避免内存碎片,由于它的对象都是在数据段创建的。 | |||
工具类 | NonThreadSafe | 仅仅在Debug下有效。提供非线程安全对象的保护机制。即创建及使用在同一线程上。 主要方法: CalledOnValidThread() | RefCountedBase在最新 Chromium分支也是继承自NonThreadSafe。 | |
ThreadCollisionWarner (base/threading/thread_collision_warner.h) | 提供一组宏。用于帮助保证类的线程安全。这个源于线程问题预防的机制,在编码层面防止线程问题。 细节參考: "Threading mess"。 主要提供的机制包含:
| |||
ThreadChecker (base/threading/thread_checker.h) | 对一个非线程安全的类。为了确保它的实例不会被跨线程进行操作,就能够使用一个ThreadChecker成员变量来进行保证。 *仅仅在Debug模式下生效。 | |||
ThreadRestrictions (base/threading/thread_restrictions.h) | 为每一个线程添加限制条件。 如不同意堵塞I/O, 是否同意单例对象等。 以单例为例。它会在base::Singleton::get()检查。 而IO的检查,则在各个IO处理的函数中检查,如LoadNativeLibrary(), SysInfo::AmountOfFreeDiskSpace(), OpenFile()等。 |
| ||
WatchDog (base/threading/watchdog.h) | 用于监測某个线程在指定时间没有响应的情况。主要方法Arm()及Disarm()。 | 在UMA中: class ShutdownWatchDogThread : public base::Watchdog { …... } |
*C++11 thread尚未使用。