类别 说明 演示样例

线程机制

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++)的更多相关文章

  1. QEMU-KVM中的多线程压缩迁移技术

    导读 目前的迁移技术,都是通过向QEMUFILE中直接写入裸内存数据来达到传送虚拟机的目的端,这种情况下,发送的数据量大,从而会导致更高的迁移时间(total time)和黑宕时间(downtime) ...

  2. Java多线程编程——并发编程原理(分布式环境中并发问题)

    在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理: 避免并发 时间戳 串行化 数据库 行锁 统一触发途径 避免并发 在分布式环境中 ...

  3. Java多线程并发技术

    Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...

  4. Java基础技术多线程与并发面试【笔记】

    Java基础技术多线程与并发 什么是线程死锁? ​死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...

  5. 在IntelliJ IDEA中多线程并发代码的调试方法

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...

  6. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  7. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  8. [转] JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  9. JAVA多线程和并发基础面试问答

    转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...

随机推荐

  1. 常见Hibernate报错处理:出现“org.hibernate.QueryException: could not resolve property”和 is not mapped和could not locate named parameter错误的解决

    正确写法: @Override @SuppressWarnings("unchecked") public List<Device> queryOSDevice(Str ...

  2. 单元测试 2 & 初识模块3

    单元测试 - 创建测试用例 单元测试是什么? (老鸟可以无视下面这段话.) hi,新同学们,咱们的PHP代码里满布着好多函数和类,经常互相调用,你改的一个函数/方法可能是"比较底层" ...

  3. objc语言的运行时处理

    在Objective-C中,消息是通过objc_msgSend()这个runtime方法及相近的方法来实现的.这个方法需要一个target,selector,还有一些参数.理论上来说,编译器只是把消息 ...

  4. Android之——获取手机安装的应用程序

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47114331 前几篇有关Android的博文中.向大家介绍了几个项目中经常使用的有 ...

  5. 火狐 http://localhost:8080自动跳转到http://www.localhost.com:8080

    用火狐调试PHP时 偶尔会出现连接被重置的情况:http://localhost:8080自动跳转到http://www.localhost.com:8080 解决方案1: 打开网络-属性,往下拉找到 ...

  6. lodash pick

    (1) _.pick(object, [props]) 创建一个从 object 中选中的属性的对象. var object = { 'a': 1, 'b': '2', 'c': 3 }; _.pic ...

  7. POSTGRESQL同步——SLONY-I配置

    来自:http://bbs.chinaunix.net/thread-955564-1-1.html 参考文档 http://bbs.chinaunix.net/viewthr ... page%3D ...

  8. Objective-C之成魔之路【19-归档】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 在Obje ...

  9. Hibernate单向“多对一”关联

    1. 基于外键关联的单向“多对一”关联是最常见的单向关联其中指定many-to-one的unique="true",为单向“一对一”,不指定就是单向“多对一” <class  ...

  10. 利用pandas进行数据分析之一:pandas数据结构Series

    Series是一种类似于一维数组的对象,又一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即是索引)组成. 可以将Series看成是一个定长的有序字段,因为它是索引值到数据值的一个映射. ...