類别
類
說明
示例
線程機制
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;
{
MutexLocker locker(m_mutex);
......
}
MutexLock
RecursiveMutex
MutexTryLocker (wtf/TreadingPrimitives.h)
ThreadCondition
條件變量的實作
并發容器
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
函數中靜态成員初始化不是線程安全的,容易出現隐患 (C++11已經聲稱可以保證)。可以使用base::LazyInstance()來解決, 同時LazyInstance可以避免記憶體碎片,因為它的對象都是在資料段建立的。
工具類
NonThreadSafe
隻在Debug下有效。提供非線程安全對象的保護機制。即建立及使用在同一線程上。
主要方法: CalledOnValidThread()
RefCountedBase在最新 Chromium分支也是繼承自NonThreadSafe。
ThreadCollisionWarner
(base/threading/thread_collision_warner.h)
主要提供的機制包括:
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()等。
<code>FILE* OpenFile(</code><code>const</code> <code>FilePath& filename,</code><code>const</code> <code>char</code><code>* mode) {</code>
<code> </code><code>ThreadRestrictions::AssertIOAllowed();</code>
<code> </code><code>…...</code>
<code>}</code>
WatchDog
(base/threading/watchdog.h)
用于監測某個線程在指定時間沒有響應的情況。主要方法Arm()及Disarm()。
在UMA中:
class ShutdownWatchDogThread : public base::Watchdog {
…...
}
*C++11 thread尚未使用。