C++并发编程学习01——hello concurrent world

经典用例

#include <iostream>
#include <thread>void hello()
{std::cout << "hello concurrent world" << std::endl;
}int main()
{std::thread t(hello);t.join();
}

编译

g++ -g test.cpp -o out -lpthread

gdb调试

(gdb) r
Starting program: /usr1/code/ch1/out 
Missing separate debuginfos, use: zypper install glibc-debuginfo-2.22-100.15.4.x86_64
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff6f79700 (LWP 17902)]
hello concurrent world
[Thread 0x7ffff6f79700 (LWP 17902) exited]
[Inferior 1 (process 17898) exited normally]
Missing separate debuginfos, use: zypper install libgcc_s1-debuginfo-8.2.1+r264010-1.3.3.x86_64 libstdc++6-debuginfo-8.2.1+r264010-1.3.3.x86_64
(gdb) c
The program is not being run.
(gdb) info threads 
No threads.
(gdb) b dm_01_01.cpp:11
Breakpoint 1 at 0x400d53: file dm_01_01.cpp, line 11.
(gdb) r
Starting program: /usr1/code/ch1/out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".Breakpoint 1, main () at dm_01_01.cpp:11
11          std::thread t(hello);
(gdb) n
[New Thread 0x7ffff6f79700 (LWP 18588)]
hello concurrent world
[Thread 0x7ffff6f79700 (LWP 18588) exited]
12          t.join();
(gdb) info threads Id   Target Id                               Frame 
* 1    Thread 0x7ffff7fda740 (LWP 18504) "out" main () at dm_01_01.cpp:12
(gdb) d
Delete all breakpoints? (y or n) y
(gdb) b dm_01_01.cpp:6
Breakpoint 2 at 0x400d2b: file dm_01_01.cpp, line 6.
(gdb) c
Continuing.
[Inferior 1 (process 18504) exited normally]
(gdb) r
Starting program: /usr1/code/ch1/out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff6f79700 (LWP 18896)]
[Switching to Thread 0x7ffff6f79700 (LWP 18896)]Thread 2 "out" hit Breakpoint 2, hello () at dm_01_01.cpp:6
6           std::cout << "hello concurrent world" << std::endl;
(gdb) info threads Id   Target Id                               Frame 1    Thread 0x7ffff7fda740 (LWP 18895) "out" 0x00007ffff7bc7a0d in pthread_join ()from /lib64/libpthread.so.0
* 2    Thread 0x7ffff6f79700 (LWP 18896) "out" hello () at dm_01_01.cpp:6
(gdb) c
Continuing.
hello concurrent world
[Thread 0x7ffff6f79700 (LWP 18896) exited]
[Inferior 1 (process 18895) exited normally]
(gdb) q

代码中注意点

  • 管理线程的函数和类在<thread>中声明,而保护共享数据的函数和类在其他
    头文件中声明
  • 每个线程都必须具有一个初始函数(initial function),新线程的执行从这个函数开始。对于应用程序来说,初始线程是main(),但是对于其他线程,可以在 std::thread 对象的构造函数中指定——本例中,被命名为 t 的 std::thread 对象使用新函数 hello()作为其初始函数。
  • 与直接写入标准输出或是从 main()调用 hello()不同,该程序启动了一个新的线程来实现,使线程数量增加到两个——初始线程始于 main(),而新线程始于hello()
  • 新的线程启动后,初始线程继续执行。如果它不等待新线程结束,它就将继续运行到main()的结尾,从而结束程序——这有可能发生在新线程运行之前。这就是为什么在这里调用 join()的原因,这会使得调用线程(在 main()中)等待与 std::thread
    对象相关联的线程,即这个例子中的 t。

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

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

相关文章

【面试】线上 CPU 100% 问题排查

回答套路一般为&#xff1a;线上服务器没有排查过&#xff0c;线上服务器只有运维才有操作权限。在平时开发的时候&#xff0c;在测试服务器上排查过。 一、复现代码 public class Test {public static void main( String[] args ){int a 0;while (a < 100) {a * 10;}} }…

Flask的用法

Flask一般分为两部分&#xff0c;一个是服务端&#xff0c;一个是客户端&#xff08;请求方&#xff09;。 一、服务端一般需要设置API接口、获取请求头、获取请求的参数&#xff08;params、data、json&#xff09;等等 二、客户端一般用于请求服务端的接口&#xff0c;配置…

C++中using 用法

C中的 using 关键字用于引入命名空间、类型别名和模板别名。以下是 using 关键字的几种常见用法及其中文解析&#xff1a; 1. 引入命名空间&#xff1a; using namespace std; 中文解析&#xff1a;引入 std 命名空间&#xff0c;使得命名空间中的成员在当前作用域内可直接使…

神经网络训练中为什么要使用batch?

使用batch训练神经网络时&#xff0c;每次模型训练&#xff0c;更新权重时&#xff0c;就拿一个batch的样本来更新权重。 求损失loss用于梯度下降&#xff0c;更新权重时&#xff0c;有几种方式。一种是全部的样本用来求loss&#xff0c;这种方式称为批量梯度下降(BGD)&#x…

Redis知识点总结

概述 Redis诞生于2009年&#xff0c;全称是Remote Dictionarty Server(远程词典服务器) 只支持单线程 非关联&#xff1a;主要指的是表中没有主外键等概念 Redis是一款内存数据库&#xff0c;主要存储键值对类型的数据 基本用法 注意&#xff1a;该操作是在cli中进行的 首…

windows安装多个版本node

1.下载nvm-setup版本 安装过程会检测到你当前使用的node版本 提示 Node v12.14.0 is already installed. Do you want NVM to control this version? 翻译&#xff1a;已安装节点v12.14.0。你想让NVM控制这个版本吗? 选择 是(Y)。 nvm默认为我们增添了环境变量&#xff0c;…

前端监控之异常监控(一)

前言 当我们的项目中假设出现了下面几种场景&#xff1a; 点击按钮后&#xff0c;页面无响应页面跳转后显示白屏页面卡顿...... 这些情况都是非常影响用户体验的&#xff0c;对于用户来说&#xff0c;是难以接受的&#xff0c;用户可能就此流失掉了。 因此前端非常有必要针对…

docker 安装 Wordpress 用lnmp搭建出现的故障

第一个故障就是mysql出现的故障了 你起mysql镜像是这么起的导致pid号用不了 docker run --namemysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql:lnmp 解决方法 docker run --namemysql -d --privilege…

vue Promise 对象 等待所有异步处理完成 再继续处理

1 定义数据集合 用来搜集所有数据 let promises []; // 用来存储所有的 Promise 对象 2 promise对象 异步 返回数据 同时添加数据到promises 列表 // 依次读取列表元素的表 for (let symbol of symbolList) {let promise new Promise((resolve, reject) > { // 将请求…

解决前后端交互Long类型精度丢失的问题

1、全局注解 package com.jiawa.train.common.config;import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.c…

【MySQL系列】统计函数(count,sum,avg)详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java中HashMap的基本介绍和详细讲解,HashMap的遍历以及HashMap的底层源码的分析

HashMap 基本介绍 HashMap 是 Java 中的一个集合类&#xff0c;实现了 Map 接口&#xff0c;用于存储键值对&#xff08;key-value&#xff09;数据。它基于哈希表的数据结构实现&#xff0c;可以实现高效的查找、插入和删除操作。 HashMap 细节讨论 无序性&#xff1a; Has…

[Linux]命令行参数和进程优先级

[Linux]命令行参数和进程优先级 文章目录 [Linux]命令行参数和进程优先级命令行参数命令行参数的概念命令函参数的接收编写代码验证 进程优先级进程优先级的概念PRI and NI使用top指令修改nice值 命令行参数 命令行参数的概念 命令行参数是指用于运行程序时在命令行输入的参数…

Qt6和Rust结合构建桌面应用

桌面应用程序是原生的、快速的、安全的&#xff0c;并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言&#xff0c;专注于安全性和性能&#xff0c;解决了 C/C 长期以来一直在努力解决的问题&#xff0c;例如内存错误和构建并发程序。 在桌面应用程序开…

css盒模型

盒模型的组成&#xff1a; content&#xff0c;padding&#xff0c;border&#xff0c;margin 盒模型的分类&#xff1a; 内容盒模型(标准盒模型) — 盒子的宽widthpaddingborder 边框盒模型 — 盒子的宽width 参考 盒模型【CSS面试题】_哔哩哔哩_bilibili

ToolAI–全球最完整最全面的AI人工智能工具集合

ToolAI是一个全球最完整最全面的AI人工智能工具集合网站&#xff0c;收集了全球最完整的数千个AI网站、工具、app&#xff0c;包含文案写作、邮件助手、聊天机器人、社交媒体等等各种行业类型的AI工具&#xff0c;可以按照地区或者分类进行查找浏览&#xff0c;目前收集6800 人…

垃圾回收器

垃圾回收器就是垃圾回收的实践者&#xff0c;随着JDK的发展&#xff0c;垃圾回收器也在不断的更迭&#xff0c;在不同的场合下使用不同的垃圾回收器&#xff0c;这也是JVM调优的一部分。 1.垃圾回收器的分类 按线程可分为单线程(串行)垃圾回收器和多线程(并行)垃圾回收器。 按…

【HTML】学习笔记(自用持续更新)

HTML基本框架 只定义信息&#xff0c;通过标签组成整个页面框架&#xff0c;再通过CSS渲染使得前端页面做的好看 <!DOCTYPE HTML> \\html类型 <html><body><h1>这是一个标题</h1><p>这是一段文字</p></body> </html> …

Java之ApI之Math类详解

1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Math类被final修饰了&#xff0c;因此该类是不能被继承的。 Math类…

“图为科技——什么是边缘计算“

边缘计算是一种新兴的计算模式&#xff0c;它将计算资源和服务推向离终端设备更近的地方。以往&#xff0c;计算任务大多集中在云端进行&#xff0c;但随着物联网和移动互联网的快速发展&#xff0c;边缘计算应运而生。 边缘计算的核心思想是将计算、存储和网络功能部署在离终端…