码迷,mamicode.com
首页 > 编程语言 > 详细

Chromium中多线程及并发技术要点(C/C++)

时间:2017-07-27 20:12:54      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:cookie   clear   fonts   iss   check   buffer   stat   reading   oda   

类别说明演示样例

线程机制

Thread(參考:线程模型及应用指南)
技术分享
 
MessagePump 
MessageQueue 
SequencedWorkerPool
它是一个线程池,用于运行须要串行运行的任务请求,这些请求根据不同的Token分组,仅仅在同样组内保证运行顺序。
这样多个组能够并行运行,而单个组则是串行运行。比方:不同实例所相应的分组不同。或者不同的功能相应不同的分组。
它同一时候同意指定当退出时未运行的任务怎样处理,包含:继续运行,忽略,阻止退出。
 
并发控制机制volatile

语言基于处理器提供的特性。

保证各个线程读数据时为最新的值。

但它的使用须要掌握一定的技巧。

參考: C/C++ Volatilekeyword深度剖析

 
 

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

函数中静态成员初始化不是线程安全的,easy出现隐患 (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尚未使用。

Chromium中多线程及并发技术要点(C/C++)

标签:cookie   clear   fonts   iss   check   buffer   stat   reading   oda   

原文地址:http://www.cnblogs.com/tlnshuju/p/7246578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!