線程機制
Thread (參考:線程模型及應用指南)語言基於處理器提供的特性。保證各個線程讀數據時為最新的值。但它的使用需要掌握一定的技巧。
參考: 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以異步的調用完成操作,在調用端以一個WaitableEvent等待任務完成.
基於Lock + ConditionVariable實現。
ConditionVariable條件變量的C/C++實現。主要方法:
Wait TimeWait BroadCast SingalInProcessCommandBuffer
CancellationFlagMutex m_mutex;
{
MutexLocker locker(m_mutex);
......
}
MutexLock
(wtf/TreadingPrimitives.h)
RecursiveMutexThreadLocalBoolean
ThreadLocalPointer
(base/threading/thread_local.h)
TLS (Thread Local Stoage) 的實現 在ThreadRestrictions中有ThreadLocal的應用: LazyInstanceImageFrameGenerator.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對一個非線程安全的類,為了確保它的實例不會被跨線程進行操作,就可以使用一個ThreadChecker成員變量來進行保證。
*只在Debug模式下生效。
ThreadRestrictionsFILE* OpenFile(
const
FilePath& filename,
const
char
* mode) {
ThreadRestrictions::AssertIOAllowed();
…...
}
WatchDog*C++11 thread尚未使用。