【C++】C++11下线程库

慈云数据 1年前 (2024-03-20) 技术支持 68 0

C++11下线程库

  • 1. thread类的简单介绍
  • 2.线程函数参数
  • 3.原子性操作库(atomic)
  • 4.mutex的种类
  • 5. RAII风格加锁解锁
    • 5.1Lock_guard
    • 5.2unique_lock
    • 6.condition_variable

      1. thread类的简单介绍

      在C++11之前,涉及到多线程问题,都是和平台相关的,比如Windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含头文件

      C++11中线程类

      还有一些和线程有关的锁、条件变量、原子操作等。

      在这里插入图片描述

      C++11线程库本质是对不同平台的线程库进行封装。

      先看看线程相关主要的接口

      在这里插入图片描述

      函数名功能
      thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程
      thread(fn,args1, args2,…)构造一个线程对象,并关联线程函数fn,args1,args2,…为线程函数的参数
      get_id()获取线程id
      jionable()线程是否还在执行,joinable代表的是一个正在执行中的线程。
      jion()该函数调用后会阻塞住线程,当该线程结束后,主线程继续执行
      detach()在创建线程对象后马上调用,用于把被创建线程与线程对象分离开,分离的线程变为后台线程,创建的线程的"死活"就与主线程无关

      在这里插入图片描述

      线程不允许拷贝构造,但支持移动构造。

      在这里插入图片描述

      也不允许赋值重载。但支持移动赋值。

      注意:

      1.线程是操作系统中的一个概念,线程对象可以关联一个线程,用来控制线程以及获取线程的状态。

      2.当创建一个线程对象后,没有提供线程函数,该对象实际没有对应任何线程。

      int main()
      {
      	thread t1;
      	return 0;
      }
      

      3.当创建一个线程对象后,并且给线程关联线程函数,该线程就被启动,与主线程一起运行。

      线程函数一般情况下可按照以下三种方式提供:

      • 函数指针
      • lambda表达式
      • 函数对象
        void ThreadFunc(int a)
        {
        	cout 
        public:
        	void operator()()
        	{
        		cout 
        	// 线程函数为函数指针
        	thread t1(ThreadFunc, 10);
        	// 线程函数为lambda表达式
        	thread t2([] {cout 
        	int n,m;
        	cinnm;
        	vector
        		//移动赋值
        		t = thread([m] {
        				for (size_t i = 0; i 
微信扫一扫加客服

微信扫一扫加客服

简体中文English