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

本文深入探讨了多种并发控制机制,包括线程模型、线程池、条件变量等,并介绍了Chromium提供的原子数据类型及WTF机制。此外还讨论了线程安全的数据传输方式和线程限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类别说明示例

线程机制

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

<think>嗯,用户咨询的是二本学历掌握C++是否能进入中型互联网公司并获得20K以上薪资的问题。这个问题很有现实意义,很多非名校背景的开发者都会关心职业天花板在哪里。 用户提供的引用材料里有个关键案例:一位二本毕业生通过项目经验积累+考研进入985院校+外企镀金的路径,最终达到1.5W-2W月薪。这个路径很有参考价值,但用户更关心中型互联网公司的直接可能性。 从行业现状来看,C++岗位确实存在学历溢价现象,但不同于Java/Python等应用层开发,C++领域更看重技术深度。用户提到的"20K以上"目标,在深圳/北京等城市的中型互联网公司属于高级工程师职级(腾讯T9/阿里P6左右),通常要求: 1. 精通Linux环境下的C++14/17开发 2. 掌握至少一个专业领域(如高并发网络/音视频/游戏引擎等) 3. 有复杂系统性能调优经验 用户是二本背景,需要重点构建差异化竞争力。引用材料里提到的外包项目经验很关键——某案例通过接兵器类通信项目积累实战经验。建议用户着重突破特定领域,比如: - 金融科技领域的低延迟交易系统 - 云原生场景的DPDK/SPDK开发 - 工业控制领域的实时系统 薪资方面有个重要细节:引用材料提到深圳DSP开发岗位薪资较高。这提示用户可以考虑嵌入式互联网化的领域,如智能驾驶(平均薪资25-35K)、机器人控制等交叉领域,这些岗位对C++要求高且学历门槛相对宽松。 关于学历短板,材料中的"考研逆袭"路径耗时较长(3年硕士+2年外企)。更高效的方案可能是: 1. 考取权威认证(如C++ Institute的CPP-501) 2. 参与开源项目(贡献Linux/Chromium等核心项目) 3. 积累专利/论文(如实时调度算法等) 需要提醒用户注意薪资结构问题。引用材料提到intel"公积金给得猛",20K月薪在深圳扣除五险一金后约16K,而某些公司可能通过项目奖金达成总收入目标。建议用户关注总包价值(含期权/绩效)。 最后要强调时间窗口:引用材料提到"深圳很缺这行业的人",当前自动驾驶/工业互联网领域对C++人才需求旺盛,可能是二本背景突破薪资瓶颈的好时机。</think>基于行业现状和职业发展规律,二本学历掌握C++要进入中型互联网公司并获得20K+月薪是**有希望但需满足特定条件**的。以下是关键路径分析: --- ### 一、薪资目标的核心影响因素 1. **技术深度 > 学历** - 中型互联网公司更看重**实战能力**,尤其在C++相关领域(如高性能计算、游戏引擎、基础设施开发等) - 需掌握: - 内存管理/多线程优化(如无锁队列、线程池) - 网络编程(TCP/IP、RDMA、DPDK) - 跨平台开发(Linux/Windows内核机制) $$ \text{竞争力} \propto \frac{\text{技术深度} \times \text{项目复杂度}}{\text{学历权重}} $$ 2. **领域选择决定溢价空间** - **高价值领域**(20K+更容易实现): - 金融科技(高频交易系统) - 云原生基础设施(K8s/容器运行时开发) - 工业软件(CAD/CAE核心模块) - 引用案例中提到的**DSP开发**在深圳稀缺性强[^1] --- ### 二、二本学历的破局路径 #### ✅ 可行方案(需18-36个月积累) 1. **项目镀金策略** - 承接**工业级项目**(如开源社区贡献、外包复杂系统) - 案例参考:*"为学术型老师长期做项目,学习合同/版权知识"*[^1] - **关键指标**:交付≥3个**并发量过万**或**延迟低于1ms**的系统 2. **垂直领域深耕** | 领域 | 技能组合 | 薪资溢价 | |------------|---------------------------|----------| | 游戏引擎 | DirectX/Vulkan/物理引擎 | 30-50% | | 自动驾驶 | ROS/点云处理/实时系统 | 40-60% | | 量化交易 | 低延迟架构/FPGA协处理 | 50-80% | 3. **证书杠杆作用** - 考取**C++ Institute CPA-211**或**Linux基金会认证** - 获得**AWS/Azure架构师认证**(云原生方向) --- ### 三、现实瓶颈与突破点 1. **简历筛选关** - 通过**GitHub技术博客**构建影响力(如复现Paper算法) - 案例:*"上学期间不为名声,只为真刀真枪的技术"*[^1] 2. **薪资谈判策略** - 用**性能指标量化价值**(例:*"优化算法使QPS提升400%"*) - 掌握**企业薪资结构**: ```mermaid graph LR A[20K月薪] --> B(基本工资12K) A --> C(绩效奖金5K) A --> D(项目分红3K) ``` 3. **地域选择** - 深圳/杭州/苏州对嵌入式/C++需求更旺盛 - 引用印证:*"深圳很缺这行业的人"*[^1] --- ### 四、成功案例参考 某二本开发者路径(引用[1]延伸): `二本毕业` → `接军工通信项目(C++实时系统)` → `主导某自动驾驶感知模块` → **深圳某中型厂25K** **关键转折**:通过**复杂系统调优经验**(将消息延迟从15ms压至0.8ms)抵消学历劣势。 --- ### 结论 **若满足以下条件则完全可能**: 1. 在**高性能计算/实时系统/基础设施**任一领域有≥3年深度实践 2. 主导过**可验证的高复杂度项目**(开源/工业部署) 3. 精准选择**地域+行业组合**(如深圳自动驾驶领域) > 📌 行动建议:优先攻坚**金融科技/云原生**领域,用开源贡献替代学历短板,同时考取**CNCF认证**增加背书。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值