您的位置:首页 > 编程语言 > C语言/C++

Chromium中多线程及并发技术要点(C/C++)

2016-01-09 00:46 621 查看
类别说明示例
线程机制
Thread(参考:线程模型及应用指南)



MessagePump
MessageQueue
SequencedWorkerPool它是一个线程池,用于执行需要串行执行的任务请求,这些请求依据不同的Token分组,只在相同组内保证执行顺序。这样多个组可以并行执行,而单个组则是串行执行。比如:不同实例所对应的分组不同,或者不同的功能对应不同的分组。它同时允许指定当退出时未执行的任务如何处理,包括:继续执行,忽略,阻止退出。参考:The FILE thread is dead, long live the blocking pool.
并发控制机制volatile语言基于处理器提供的特性。保证各个线程读数据时为最新的值。但它的使用需要掌握一定的技巧。
参考: C/C++ 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;
{
MutexLocker locker(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>::Leakyg_io_disallowed = LAZY_INSTANCE_INITIALIZER;
ThreadSafeDataTransport
(wtf/ThreadSafeDataTransport.h)
以线程安全的方式在一对生产者和消费者之间利用SharedBuffer传递数据。减少线程冲突和数据拷贝。ImageFrameGenerator.h
更多的说明
LazyInstance函数中静态成员初始化不是线程安全的,容易出现隐患 (C++11已经声称可以保证)。可以使用base::LazyInstance()来解决, 同时LazyInstance可以避免内存碎片,因为它的对象都是在数据段创建的。
参考:Eliminating static initializers.
工具类NonThreadSafe只在Debug下有效。提供非线程安全对象的保护机制。即创建及使用在同一线程上。
主要方法: CalledOnValidThread()
RefCountedBase在最新 Chromium分支也是继承自NonThreadSafe。
ThreadCollisionWarner
(base/threading/thread_collision_warner.h)
提供一组宏,用于帮助保证类的线程安全。这个源于线程问题预防的机制,在编码层面防止线程问题。细节参考: "Threading mess"
主要提供的机制包括:
DFAKE_SCOPED_LOCK, 限制某个函数只能在一个线程上运行。
DFAKE_SCOPED_RECURSIVE_LOCK, 多个函数可以在同一线程上嵌套调用。
DFAKE_SCOPED_LOCK_THREAD_LOCKED, 同时只允许一个函数运行在相同的线程上。包括创建和释放应当在同一线程上。
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()等。
FILE* OpenFile(
const
FilePath& filename,
const
char
* mode) {
ThreadRestrictions::AssertIOAllowed();
…...
}
WatchDog
(base/threading/watchdog.h)
用于监测某个线程在指定时间没有响应的情况。主要方法Arm()及Disarm()。在UMA中:class ShutdownWatchDogThread : public base::Watchdog { …...}
*C++11 thread尚未使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: