程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Chromium中多線程及並發技術要點(C/C++)

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

編輯:關於C++
類別 類 說明 示例

線程機制

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::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"。

主要提供的機制包括:

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

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved