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

简介: 类别类说明示例线程机制Thread(参考:线程模型及应用指南) MessagePump MessageQueue SequencedWorkerPool它是一个线程池,用于执行需要串行执行的任务请求,这些请求依据不同的Token分组,只在相同组内保证执行顺序。
类别 说明 示例

线程机制

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

目录
相关文章
|
10天前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
76 0
|
13天前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
32 1
C++ 多线程之初识多线程
|
11天前
|
Java 数据库连接 数据库
不同业务使用同一个线程池发生死锁的技术探讨
【10月更文挑战第6天】在并发编程中,线程池是一种常用的优化手段,用于管理和复用线程资源,减少线程的创建和销毁开销。然而,当多个不同业务场景共用同一个线程池时,可能会引发一系列并发问题,其中死锁就是最为严重的一种。本文将深入探讨不同业务使用同一个线程池发生死锁的原因、影响及解决方案,旨在帮助开发者避免此类陷阱,提升系统的稳定性和可靠性。
36 5
|
8天前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
21 1
|
13天前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
36 6
|
1月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
42 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
13天前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
16 0
C++ 多线程之线程管理函数
|
9天前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
31 0
|
27天前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
47 0
|
1月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。