std::thread使用

news/2024/10/24 9:18:01/

std::thread使用

  • join & detach
  • joinable() 函数
  • 代码演示
    • 主线程不做操作
    • join
    • detach

join & detach

定义区别:

  • join 会阻塞,调用线程等待子线程执行完毕,然后再往下执行
  • detach 分离,调用线程不再等待子线程结束,执行 detach 后,子线程和调用线程失去关联,驻留在后台,由 C++ 运行时库接管

使用方式区别:

  • join 需要注意代码逻辑调用顺序,在需要阻塞等待的地方执行
  • detach 只要在构造之后都可以

joinable() 函数

joinable : 代表该线程是可执行线程。

not-joinable :通常一下几种情况会导致线程成为not-joinable

 1) 由thread的缺省构造函数构造而成(thread()没有参数)。2) 该thread被move过(包括move构造和move赋值)3) 该线程调用过join或者detac

代码演示

// 文件名为test.cpp
// 编译时需链接thread库,不然会报错 undefined reference to 'pthread_create' 
// g++ -Wall -pthread -g -o test test.cpp

主线程不做操作

#include <thread>
#include <iostream>
using namespace std;void functionToThread()
{cout << "线程启动......" << endl;cout << "1......" <<endl;cout << "2......" <<endl;cout << "3......" <<endl;cout << "4......" <<endl;cout << "5......" <<endl;cout << "线程结束......" << endl;
}int main()
{thread myThread(&functionToThread);cout << "主线程结束......" <<endl;return 0;
}/*主线程结束......terminate called without an active exception已放弃 (核心已转储)*/

join

#include <thread>
#include <iostream>
using namespace std;
void functionToThread()
{cout << "线程启动......" << endl;cout << "1......" <<endl;cout << "2......" <<endl;cout << "3......" <<endl;cout << "4......" <<endl;cout << "5......" <<endl;cout << "线程结束......" << endl;
}int main()
{thread myThread(&functionToThread);if( myThread.joinable() )//可联结{myThread.join();//阻塞等待线程结束}cout << "主线程结束......" <<endl;return 0;
}/*线程启动......1......2......3......4......5......线程结束......主线程结束......*/

detach

#include <thread>
#include <iostream>
using namespace std;
void functionToThread()
{cout << "线程启动......" << endl;cout << "1......" <<endl;cout << "2......" <<endl;cout << "3......" <<endl;cout << "4......" <<endl;cout << "5......" <<endl;cout << "线程结束......" << endl;
}int main()
{thread myThread(&functionToThread);if( myThread.joinable() )//可联结{myThread.detach();//不会等待线程结束}cout << "主线程结束......" <<endl;return 0;
}
/*主线程结束......*/

参考文章:
1、joinable
https://blog.csdn.net/bobbypeng/article/details/100055167
2、join 和 detach
https://blog.csdn.net/lizhichao410/article/details/123572144
3、编译问题
https://blog.csdn.net/qq907482638/article/details/104542871


http://www.ppmy.cn/news/74115.html

相关文章

【牛客刷题专栏】0x30:JZ38 字符串的排列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

管中窥豹!从冠德石油看数字化对加油站的影响力

从上个世纪90年代起&#xff0c;至2010年前后&#xff0c;是国内信息化建设的高速发展期。这段时间无论是应用软件、企业网站还是商业咨询&#xff0c;无不呈现井喷式发展。大多数企业和政府机关均完成了或多或少的信息化建设。IT带来了标准化、科学化的管理和运作模式&#xf…

当Python遇上异步编程:实现高效、快速的程序运行!

前言 同步/异步的概念&#xff1a; 同步是指完成事务的逻辑&#xff0c;先执行第一个事务&#xff0c;如果阻塞了&#xff0c;会一直等待&#xff0c;直到这个事务完成&#xff0c;再执行第二个事务&#xff0c;顺序执行 异步是和同步相对的&#xff0c;异步是指在处理调用这…

C++——内存管理+模块

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月19日 内容&#xff1a;C——内存管理模块 目录 前言&#xff1a; 1.new和delete操作自定义类型&#xff1a; operator new/delete&#xff1a; 定位new表达式&#xff08;placement-new&#xff09;&#xff1a; …

Lucene(4):Field域类型

1 Field属性 Field是文档中的域&#xff0c;包括Field名和Field值两部分&#xff0c;一个文档可以包括多个Field&#xff0c;Document只是Field的一个承载体&#xff0c;Field值即为要索引的内容&#xff0c;也是要搜索的内容。 是否分词(tokenized) 是&#xff1a;作分词处理…

Git的项目管理工具的使用

Git的项目管理工具的使用 为什么学习Git软件&#xff1f; 主流开发中&#xff0c;基于互联网的开发项目都会使用git进行资源管理 资源管理&#xff1a;人力资源 ​ 代码资源 : .java .c . js 等 ​ 文档资源 &#xff1a; doc.md ,pdf 等 git是最常用的scm软件&#xff08;Soft…

软考初级程序员上午单选题(15)

1、在目前流行的大多数PC中&#xff0c;硬盘一般是通过硬盘接口电路连接到______。 A&#xff0e;CPU局部总线 B&#xff0e;PCI总线 C&#xff0e;ISA总线(AT总线) D&#xff0e;存储器总线 2、松耦合多处理机实现处理机间通信靠的是______。 A&#xff0e;共享主存 B&#x…

错题汇总10

1.如果MyClass为一个类&#xff0c;执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是 A 2 B 5 C 4 D 9 5个Myclass对象的一个数组&#xff0c;调用5次Myclass类的构造函数 b实际为一个指针数组&#xff0c;该数组中每个元素都是Myclass*&#xff0c;不会调用…