C++多线程——线程

embedded/2024/11/29 4:23:24/

1、线程与进程

    进程是一个具有独立功能程序的运行实体,如某一个程序,运行时便产生一个进程;通常一个进程包含一个或多个线程。普通C程序多是只含有一个线程的进程,但是大多数情况下遇到的是多线程的进程。

    线程与进程都是操作系统的概念。不同进程之间相互独立,同一进程的线程共享该进程的地址空间及其他资源。
    线程与进程关系如下图:


2、与 C++11 多线程相关的头文件

c++11 新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>

  • <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。
  • <thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。
  • <mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类型和函数。
  • <condition_variable>:该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和 std::condition_variable_any。
  • <future>:该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和 std::shared_future 两个 Future 类,另外还有一些与之相关的类型和函数,std::async() 函数就声明在此头文件中。

3、初识线程

#include <iostream>
#include <thread>
using std::thread;
using std::cout;
using std::endl;
int k = 0;
void fun() {//线程休眠,seconds(5)表示子线程休眠5秒,chrono是c++11的时间相关库。std::this_thread::sleep_for(std::chrono::seconds(5));for (int i = 0;i < 10;++i) {cout << "hello world" << endl;k++;}
}
/**********************************************************************
注意:
2.主线程函数不能提前结束于新创建的线程函数,因为在c++11中,线程也是对象,
主函数结束线程对象即销毁。
3.t.join()是主函数阻塞等待线程结束才能结束,主函数会继续执行,并阻塞在return处,
t.detach()主函数和线程函数分离,各自执行各自的,线程变为后台线程。
4.可通过bind和lambda创建线程可以将线程保存在容器中,以保证线程对象的声明周期。
但是注意线程没有拷贝构造函数,有移动构造函数。 
***********************************************************************/
int main(int argc,char *argv[]) {//创建线程对象thread t1(fun);//获得线程ID和CPU核数cout << "ID:" << t1.get_id() << endl;cout << "CPU:" << thread::hardware_concurrency() << endl;//主函数阻塞等待线程结束t1.join();cout << k << endl;system("pause");return EXIT_SUCCESS;
}


4、thread类:

5、std::thread构造:



(1). 默认构造函数,创建一个空的 thread 执行对象。
(2). 初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。
(3). 拷贝构造函数(被禁用),意味着 thread 不可被拷贝构造。
(4). move 构造函数,move 构造函数,调用成功之后 x 不代表任何 thread 执行对象。
注意:可被 joinable 的 thread 对象必须在他们销毁之前被主线程 join 或者将其设置为 detached.
6、多线程的优势:

  •  提高应用程序的响应速度:相比单线程程序,多线程程序不必等待其他线程完成就可以开始另一个线程。
  •  有效使用多处理器,提高CPU利用率:多线程程序能很好的使用多处理器,提高运行速度。
  •  节省系统资源: 处理同步任务时,使用两个线程比使用两个进程节省大量的系统资源。

http://www.ppmy.cn/embedded/141354.html

相关文章

微信小程序全局配置:TabBar与页面配置详解

微信小程序全局配置:TabBar与页面配置详解 引言 随着移动互联网的迅猛发展,微信小程序作为一种新兴的应用形式,因其便捷性和丰富的功能而受到广泛欢迎。在小程序的开发过程中,全局配置是非常重要的一环,尤其是tabBar和页面的配置。本文将深入探讨微信小程序的全局配置,…

51单片机从入门到精通:理论与实践指南入门篇(三)

上一节博客给大家基本介绍了51单片机 51单片机从入门到精通&#xff1a;理论与实践指南入门篇&#xff08;二&#xff09; https://blog.csdn.net/speaking_me/article/details/144068159?spm1001.2014.3001.5501 那么这节课就来介绍——花样流水灯的实现 花样流水灯电路设…

TCP/IP网络编程-C++(上)

TCP/IP网络编程-C &#xff08;上&#xff09; 一、基于TCP的服务端/客户端1、server端代码2、client端代码3、socket() 函数3.1、函数原型3.2、参数解析3.2.1、协议族&#xff08;domain参数&#xff09;3.2.2、套接字类型&#xff08;type参数&#xff09;3.2.3、最终使用的协…

【C++】string类练习

test1:反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s "ab-cd" 输出&#xff1a;…

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)

通过bdf号查看 -s &#xff08;bus&#xff09; lspci -s 03:00.0通过vendor id或者device id等设备查看 -d &#xff08;device&#xff09; lspci -d 15b3: #这里是vendor号&#xff0c;所以在前面 lspci -d :1021 #这里是设备号&#xff0c;所以要:在前vendorid和deviceid…

Postman定义公共函数

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman定义公共函数 在postman中&#xff0c;如下面的代码&#xff1a; 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[…

视频 wmv 转MP4

ffmpeg -i input.wmv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4命令说明 -i input.wmv&#xff1a; 指定输入文件 input.wmv。 -c:v libx264&#xff1a; 使用 H.264 视频编码&#xff0c;适用于 MP4 格式。 -crf 23&#xff1a; 设置视频质量&#…

uniapp生命周期:应用生命周期和页面生命周期

文章目录 1.应用的生命周期2.页面的生命周期 1.应用的生命周期 生命周期的概念&#xff1a;一个对象从创建、运行、销毁的整个过程被称为生命周期 生命周期函数&#xff1a;在生命周期中每个阶段会伴随着每一个函数的出发&#xff0c;这些函数被称为生命周期函数 所有页面都…