Chromium中多執行緒及併發技術要點(C/C++)

Horky發表於2016-01-09
類別說明示例

執行緒機制

Thread(參考:執行緒模型及應用指南)

 
MessagePump 
MessageQueue 
SequencedWorkerPool
它是一個執行緒池,用於執行需要序列執行的任務請求,這些請求依據不同的Token分組,只在相同組內保證執行順序。
這樣多個組可以並行執行,而單個組則是序列執行。比如:不同例項所對應的分組不同,或者不同的功能對應不同的分組。
它同時允許指定當退出時未執行的任務如何處理,包括:繼續執行,忽略,阻止退出。
 
併發控制機制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>::Leaky
    g_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"

主要提供的機制包括:

  1. DFAKE_SCOPED_LOCK, 限制某個函式只能在一個執行緒上執行。
  2. DFAKE_SCOPED_RECURSIVE_LOCK, 多個函式可以在同一執行緒上巢狀呼叫。
  3. 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尚未使用。

相關文章