C++并发编程实战第2版笔记

news2024/11/19 23:20:59

文章目录

    • p19 某个线程只可以join()一次
    • p22 只有当joinable()返回true时才能调用detach()
    • P21 在std::thread对象析构前,必须明确是等待还是分离线程
    • P25 移动语义
    • P25 将类的成员函数设定为线程函数
    • p41 std::mutex和类模板std::lock_guard<>

p19 某个线程只可以join()一次

只要调用了join(),隶属于该线程的任何存储空间即会因此清除,std::thread对象遂不再关联到已结束的线程。

事实上,它(std::thread)与任何线程均无关联。其中的意义是,对于某个给定的线程,join()仅能调用一次;只要std::thread对象曾经调用过join(),线程就不再可汇合(joinable),成员函数joinable()将返回false。

p22 只有当joinable()返回true时才能调用detach()

若没有与std::thread对象关联的任何线程,便不能凭空调用detach()
只有当t.joinable()返回true时才可调用t.detach()

P21 在std::thread对象析构前,必须明确是等待还是分离线程

std::thread对象析构前,必须明确,是等待线程完成(join)还是要与之分离(detach)。

如果等待std::thread对象销毁之际还没决定好,那std::thread的析构函数将会调用std::terminate()终止整个程序。

示例代码:

#include <thread>
#include <iostream>

void do_lengthy_work()
{
    std::cerr << __FUNCTION__;
};

int main(void)
{

    {
        std::thread t(do_lengthy_work);
        //t.join()
        //理应在这里join或detach
    }

    while (1)
    {
    }
}

这里我们既不join也不detach,那么就会导致std::terminate()被调用,导致程序终止。
在这里插入图片描述

P25 移动语义

若源对象是临时变量,移动就会自动发生。
若源对象是具名变量,则必须通过调用std::move()直接请求转移。

标准库中有一些类的归属权语义是 是只可移动但不可复制的,如std::threadstd::unique_ptr

P25 将类的成员函数设定为线程函数

class X{
public:
	void do_lengthy_work();
};

X my_x;
std::thread t(&X::do_lengthy_work, &my_x);

若要将某个类的成员函数设定为线程函数,应传入一个函数指针,指向该成员函数。

此外,还要给出合适的对象指针,作为该函数的第一个参数。

p41 std::mutex和类模板std::lock_guard<>

在C++中,通过构造std::mutex的实例来创建互斥,调用lock()成员函数对其加锁,调用unlock()解锁。

但不推荐直接条约成员函数的做法

因为,若按此处理,在函数以外的每条代码路径上都要调用unlock(),包括由于异常退出的路径。(注:这个路径应该指的是代码结束路径,如return、exit,总之,跳出的时候)

推荐用C++标准库提供的类模板std::lock_guard<>

示例代码:

#include <algorithm>
#include <list>
#include <mutex>

std::list<int> some_list;
std::mutex some_mutex;

void add_to_list(int new_value)
{
	std::lock_guard<std::mutex> guard(some_mutex);
	some_list.push_back(new_value);
}

void list_contains(int value_to_find)
{
	std::lock_guard<std::mutex> guard(some_mutex);
	if(std::find(some_list.begin(), some_list.end(), value_to_find) == some_list.end())
		return false;
	else
		return true;
}

如果使用的是C++17,还可以将std::lock_guard<>简化为std::lock_guard,省略模板参数列表。这是一个新特性,名为类模板参数推导

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多传感器融合SLAM数学学习历程

多传感器融合SLAM数学学习历程 >>> 流形和流形空间&#xff08;姿态&#xff09; https://blog.csdn.net/professor_Xie/article/details/131911894 fast-lio 带着问题 看知识 欧式空间和流形空间的区别和联系? 基本结构&#xff1a;欧式空间是我们熟悉的传统三维…

胖东来热度持续上升的原因是什么?

胖东来超市胖东来超市是一家知名的连锁超市&#xff0c;以其优质的服务和丰富的商品而闻名。在这个充满竞争的市场中&#xff0c;胖东来超市始终保持着良好的业绩和口碑。那胖东来爆火的原因是什么呢&#xff1f; 1.人性化服务&#xff1a;胖东来超市坚信零售不仅仅是商品的销售…

Linux动态分配IP与正向解析DNS

目录 一、DHCP分配 1. 动态分配 1.1 服务端服务安装 1.2 修改服务端dhcp配置 1.3 修改客户端dhcp&#xff0c;重启查询网卡信息 2. 根据mac固定分配 2.1 修改服务器端dhcp服务配置 2.2 客户端自动获取&#xff0c;查看网卡信息 二、时间同步 1. 手动同步 2. 自动同…

【MySQL】表设计与范式设计

文章目录 一、数据库表设计一对一一对多多对多 二、范式设计第一范式第二范式第三范式BC范式第四范式 一、数据库表设计 一对一 举个例子&#xff0c;比如这里有两张表&#xff0c;用户User表 和 身份信息Info表。 因为一个用户只能有一个身份信息&#xff0c;所以User表和In…

无限创意与自由协作:现可在 Splashtop 上使用 Wacom Bridge 的通用版本

2024年1月9日 加利福尼亚州库比蒂诺和俄勒冈州波特兰 数字笔技术的全球领导者 Wacom 和高性能远程访问解决方案供应商 Splashtop 宣布正式发布 Wacom Bridge 的通用版本&#xff0c;目前可在几个特定国家的 Splashtop Enterprise 和 Splashtop Business Access Performance 产…

AppDesigner滤波器幅度仿真——IIR和FIR二十余种

1、AppDesigner简介 MATLAB Designer为滤波器设计提供了直观而高效的工具。通过该系统&#xff0c;用户可以通过简单的操作&#xff0c;选择不同的滤波器类型和模块&#xff0c;调整输入参数指标&#xff0c;即可实现滤波器的设计和幅值的绘制。这种图形化的设计方式使得即便对…

Hana 实时数据同步优化(3)

简述 CloudCanal 近期对 Hana 源端链路做了新一轮优化&#xff0c;优化点主要来自用户实际场景使用&#xff0c;这篇文章简要做下分享。 本轮优化主要包含: 新增任务级增量表新增增量表定时清理能力新增增量表表结构自动演进能力任务延迟判定优化Hana 1.x 的兼容产品化和文档…

ROS-urdf集成gazebo

文章目录 一、URDF与Gazebo基本集成流程二、URDF集成Gazebo相关设置三、URDF集成Gazebo实操四、Gazebo仿真环境搭建 一、URDF与Gazebo基本集成流程 1.创建功能包 创建新功能包&#xff0c;导入依赖包: urdf、xacro、gazebo_ros、gazebo_ros_control、gazebo_plugins 2.编写URD…

linux部署apache服务部署静态网站

第一步&#xff1a;配置IP地址 第二步&#xff1a;创建挂载点 配置yum仓库 mkdir -p /media/cdrom 挂载 mount /dev/cdrom /media/cdrom 安装服务 安装yum源 启用httpd服务程序并将其加入到开机启动项中 建立网站数据保存目录&#xff0c;并创建首页文件 mkdir /home/wwwroo…

源码搭建教学:连锁餐饮APP开发实战

连锁餐饮APP&#xff0c;对于很多从事餐饮行业的人来说不会陌生&#xff0c;同样这个项目本身就有着很高的热度。今天&#xff0c;小编将深入为大家讲述一下此系统的前后端开发、数据库设计、用户界面设计等方面&#xff0c;让您深入了解全栈开发的方方面面。 一、项目准备与规…

【排序】对各种排序的总结

文章目录 前言1. 排序算法的复杂度及稳定性分析2. 排序算法的性能测试2.1 重复率较低的随机值排序测试2.2 重复率较高的随机值排序测试 前言 本篇是基于我这几篇博客做的一个总结&#xff1a; 《简单排序》&#xff08;含&#xff1a;冒泡排序&#xff0c;直接插入排序&#x…

git 中的概念

git 中的概念 在使用 Git 版本控制的过程中&#xff0c;有些概念我们必须有所了解&#xff0c;这样才能更有效率也更有意义的学下去。 有清楚且正确的概念认知&#xff0c;不但有助于我们学习如何操作 Git 命令&#xff0c;更重要的是&#xff0c;学习 Git 的相关知识也会更加…

字符串处理(将字符串中符合十六进制数据格式的数字和字符按照其对应的十进制数值进行累加) C语言xdoj704

题目描述&#xff1a; 输入由数字和字符构成的字符串&#xff08;不包含空格&#xff09;&#xff0c;将字符串中符合十六进制数据格式的数字和字符按照其对应的十进制数值进行累加&#xff0c;并输出累加结果&#xff0c;如果字符串中不含有任何满足十六进制格式的字符&#x…

云服务器租用价格表,阿里云腾讯云华为云2024年优惠对比

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

休息一会 sleep

文章目录 休息一会 sleep休息5分钟1小时后提醒我时分秒搭配使用倒计时计时器结合脚本更多信息 休息一会 sleep … note:: 莫听穿林打叶声&#xff0c;何妨吟啸且徐行。 苏轼 Linux sleep命令可以用来将目前动作延迟一段时间。 sleep的官方定义为&#xff1a; sleep - delay …

《路由与交换技术》---练习题(无答案纯享版)

注意&#xff01;&#xff01;&#xff01;这篇blog是无答案纯享版的 选择填空的答案我会放评论区 简答题可以看这里 计算题可以发私信问我&#xff08;当然WeChat也成&#xff09;but回讯息很慢 一、选择题 1.以下不会在路由表里出现的是: ( ) A.下一跳地址 B.网络地址 C…

工业异常检测AnomalyGPT-训练试跑及问题解决

写在前面&#xff0c;AnomalyGPT训练试跑遇到的坑大部分好解决&#xff0c;只有在保存模型失败的地方卡了一天才解决&#xff0c;本来是个小问题&#xff0c;昨天没解决的时候尝试放弃在单卡的4090上训练&#xff0c;但换一台机器又遇到了新的问题&#xff0c;最后决定还是回来…

Simpy简介:python仿真模拟库-03/5

一、说明 在过去的两篇文章中&#xff0c;我们了解了 simpy 的基础知识、声明变量和处理表达式。值得注意的例子包括评估导数和积分。现在&#xff0c;让我们继续使用函数。 二、SymPy — 函数类 SymPy 包包含 sympy.core.function 模块中的 Function 类。该类作为各种数学函数…

软件测试|如何在 Python 中比较两个列表

简介 在Python中&#xff0c;比较两个列表是一个常见的任务&#xff0c;可以帮助你找出两个列表之间的差异、共同元素或其他关系。本文将详细介绍如何在Python中比较两个列表的不同方法&#xff0c;包括使用循环、集合操作和列表推导式等。 方法1&#xff1a;使用循环比较列表…

2024年美赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…