Chromium中多线程及并发技术要点(C/C++)
| 类别 | 类 | 说明 | 演示样例 | |
|---|---|---|---|---|
|
线程机制 |
Thread | (參考:线程模型及应用指南) |
||
| 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; { ...... } |
||
|
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能够避免内存碎片,由于它的对象都是在数据段创建的。 |
|
||
| 工具类 | NonThreadSafe |
仅仅在Debug下有效。提供非线程安全对象的保护机制。即创建及使用在同一线程上。 主要方法: CalledOnValidThread() |
RefCountedBase在最新 Chromium分支也是继承自NonThreadSafe。 |
|
|
ThreadCollisionWarner (base/threading/thread_collision_warner.h) |
提供一组宏。用于帮助保证类的线程安全。这个源于线程问题预防的机制,在编码层面防止线程问题。 细节參考: "Threading mess"。 主要提供的机制包含:
|
|
||
| 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()等。
|
|
||
| WatchDog (base/threading/watchdog.h) |
用于监測某个线程在指定时间没有响应的情况。主要方法Arm()及Disarm()。 |
在UMA中:
class ShutdownWatchDogThread : public base::Watchdog {
…...
}
|
*C++11 thread尚未使用。
Chromium中多线程及并发技术要点(C/C++)的更多相关文章
- QEMU-KVM中的多线程压缩迁移技术
导读 目前的迁移技术,都是通过向QEMUFILE中直接写入裸内存数据来达到传送虚拟机的目的端,这种情况下,发送的数据量大,从而会导致更高的迁移时间(total time)和黑宕时间(downtime) ...
- Java多线程编程——并发编程原理(分布式环境中并发问题)
在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理: 避免并发 时间戳 串行化 数据库 行锁 统一触发途径 避免并发 在分布式环境中 ...
- Java多线程并发技术
Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...
- Java基础技术多线程与并发面试【笔记】
Java基础技术多线程与并发 什么是线程死锁? 死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...
- 在IntelliJ IDEA中多线程并发代码的调试方法
通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- [转] JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- JAVA多线程和并发基础面试问答
转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...
随机推荐
- PhantomJS用法示例
收录待用,修改转载已取得腾讯云授权 前言 大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的html代码,如果页面是JS渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索JS ...
- 转:ios的crash框架方法论
http://www.cocoachina.com/ios/20150701/12301.html 1. 其中提到的提高ios崩溃率的用法.
- ZT:有些人,活了一辈子,其实不过是认真过了一天,其余时间都在重复这一天而已
出处:http://news.163.com/17/1011/19/D0G7UEDS0001982T.html 有些人,活了一辈子,其实不过是认真过了一天,其余时间都在重复这一天而已,也有人每天不重样 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面快速入门 TC2
创建最简单的静态文本,就像是label,就只需要绘制一个矩形框,然后填写Text,取消边框即可(你也可以设置自定义字体) 创建动态的文本框,就像是textbox,需要设置这个矩形框的Text为%d ...
- MPTCP 源码分析(六) 数据重发
简述 TCP使用定时器函数tcp_retransmit_timer进行数据重发,MPTCP需要重发数据的时候, 不仅仅在原路径发送数据,而且会在另外一条子路径进行重发.这样考虑的原因是: 考 ...
- MYSQL百万级数据,如何优化
MYSQL百万级数据,如何优化 首先,数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度.但是,有些情况索引是 ...
- SurfaceView的经典写法
package com.example.test; import android.content.Context; import android.graphics.Canvas; import and ...
- java自定义注解与反射
java注解与反射一.Java中提供了四种元注解,专门负责注解其他的注解,分别如下 1.@Retention元注解,表示需要在什么级别保存该注释信息(生命周期).可选的RetentionPoicy参数 ...
- 电脑 F键(功能键)的具体作用
F1:如果你处在一个选定的程序中而需要帮助,那么请按下F1.如果现在不是处在任何程序中,而是处在资源管理器或桌面,那么按下F1就会出现Windows的帮助程序.如果你正在对某个程序进行操作,而想得到W ...
- 02-3设置第一启动项--进入BIOS设置USB方式启动
设置USB方式启动 https://zhinan.sogou.com/guide/detail/?id=1610014869 如何设置电脑从U盘启动呢?今天小编教大家如何进入BIOS设置USB方式启动 ...