天天看點

Chromium中多線程及并發技術要點(C/C++)

類别

說明

示例

線程機制

Thread

Chromium中多線程及并發技術要點(C/C++)

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&amp; 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尚未使用。