文章 2023-10-17 来自:开发者社区

[笔记]C++并发编程实战 《三》线程间共享数据(四)

3.3.1 保护共享数据的初始化过程假设你有一个共享源,构建代价很昂贵,它可能会打开一个数据库连接或分配出很多的内存。延迟初始化(Lazy initialization)在单线程代码很常见——每一个操作都需要先对源进行检查,为了了解数据是否被初始化,然后在其使用前决定,数据是否需要初始化:std::shared_ptr<some_resource> resource_ptr; voi....

文章 2023-10-17 来自:开发者社区

[笔记]C++并发编程实战 《三》线程间共享数据(三)

使用锁的层次结构虽然,定义锁的顺序是一种特殊情况,但锁的层次的意义在于提供对运行时约定是否被坚持的检查。这个建议需要对你的应用进行分层,并且识别在给定层上所有可上锁的互斥量。当代码试图对一个互斥量上锁,在该层锁已被低层持有时,上锁是不允许的。你可以在运行时对其进行检查,通过分配层数到每个互斥量上,以及记录被每个线程上锁的互斥量。下面的代码列表中将展示两个线程如何使用分层互斥。清单3.7 使用层次....

文章 2023-10-17 来自:开发者社区

[笔记]C++并发编程实战 《三》线程间共享数据(二)

3.2.3 定位接口间的条件竞争因为使用了互斥量或其他机制保护了共享数据,就不必再为条件竞争所担忧吗?并不是,你依旧需要确定数据是否受到了保护。回想之前双链表的例子,为了能让线程安全地删除一个节点,需要确保防止对这三个节点(待删除的节点及其前后相邻的节点)的并发访问。如果只对指向每个节点的指针进行访问保护,那就和没有使用互斥量一样,条件竞争仍会发生——除了指针,整个数据结构和整个删除操作需要保护....

[笔记]C++并发编程实战 《三》线程间共享数据(二)
文章 2023-10-17 来自:开发者社区

[笔记]C++并发编程实战 《三》线程间共享数据(一)

前言本章主要内容共享数据带来的问题使用互斥量保护数据数据保护的替代方案第3章 线程间共享数据上一章中,我们已经对线程管理有所了解,现在让我们来看一下“共享数据的那些事”。想象一下,你和你的朋友合租一个公寓,公寓中只有一个厨房和一个卫生间。当你的朋友在卫生间时,你就会不能使用了(除非你们特别好,可以在同时使用一个房间)。这个问题也会出现在厨房,假如:厨房里有一个组合式烤箱,当在烤香肠的时候,也在做....

[笔记]C++并发编程实战 《三》线程间共享数据(一)
文章 2023-10-17 来自:开发者社区

[笔记]C++并发编程实战 《二》线程管理(二)

2.2 向线程函数传递参数清单2.4中,向 std::thread 构造函数中的可调用对象,或函数传递一个参数很简单。需要注意的是,默认参数要拷贝到线程独立内存中,即使参数是引用的形式,也可以在新线程中进行访问。再来看一个例子:void f(int i, std::string const&amp; s); std::thread t(f, 3, "hello");代码创建了一个调用f(3, "....

文章 2023-10-17 来自:开发者社区

[笔记]C++并发编程实战 《二》线程管理(一)

前言第2章 线程管理本章主要内容启动新线程等待线程与分离线程线程唯一标识符好的!看来你已经决定使用多线程了。先做点什么呢?启动线程、结束线程,还是如何监管线程?C++标准库中只需要管理 std::thread 关联的线程,无需把注意力放在其他方面。不过,标准库太灵活,所以管理起来不会太容易。本章将从基本的开始:启动一个线程,等待这个线程结束,或放在后台运行。再看看怎么给已经启动的线程函数传递参数....

[笔记]C++并发编程实战 《二》线程管理(一)
文章 2023-10-16 来自:开发者社区

[笔记]c++基础实践《一》std::thread以及多线程相关概念

前言一、常见的锁按功能分类互斥锁/独占锁/排他锁std::mutex互斥变量,申请内核锁。std::lock_guard在std::lock_guard变量创建时内 加锁,生命周期结束就释放锁。俗称c++ RAII 资源管理机制std::unique_lockC++11中std::unique_lock的使用std::unique_lock为锁管理模板类,是对通用mutex的封装。std::un....

[笔记]c++基础实践《一》std::thread以及多线程相关概念

本页面内关键词为智能算法引擎基于机器学习所生成,如有任何问题,可在页面下方点击"联系我们"与我们沟通。

开发与运维

集结各类场景实战经验,助你开发运维畅行无忧

+关注