文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++多线程编程之创建线程篇

2024-12-03 10:47

关注

 多线程是程序员必须掌握的一门技术,本文主要是针对于C++新标准中多线程库,需要具备一定C++基础方可学习。


前言

本章节主要C++多线程编程中的一些基本概念以及几种创建线程的方式。

并发、进程、线程的基本概念

并发两个或者多个任务(独立的活动)同时发生(进行):一个程序通知执行多个独立的任务并发假象(不是真正的并发):单核CPU通过上下文切换方式实现进程

进程计算机中的程序关于某数据集合上的一次运行活动

进程特性

  1. 动态性:进程是程序的一次执行过程,是临时的,有生命期,是动态产生,动态消亡的;
  2. 并发性:任何进程都可以同其他进行一起并发执行;
  3. 独立性:进程是系统进行资源分配和调度的一个独立单位;
  4. 结构性:进程由程序,数据和进程控制块三部分组成

线程每个进程都有一个主线程并且主线程是唯一的,也就是一个进程只能有一个主线程。vs编译器中ctr+f5编译运行程序时,实际是主线程调用mian函数中的代码。线程可以理解为代码执行通道,除了主线程之外,可以自己创建其他线程。

并发实现方案

主要解决是进程间通信问题

同一电脑上可通过管道,文件,消息队列,共享内存等方式实现

不同电脑可通过socket网络通信实现

多个进程实现并发

单独进程,多个线程实现并发 即一个主线程,多个子线程实现并发一个进程中的所有线程共享内存空间(共享内存),例如全局变量,指针引用等,所以多线程开销远远小于多进程。共享内存也会导致数据一致性问题(资源竞争问题)。

C++线程编程基本操作

首先需要包含thread头文件

  1. #include  
  2. #include  

创建线程: thread类创建一个线程

  1. #include  
  2. void print() 
  3.  std::cout<<"子线程"<
  4. int main() 
  5.     //运行程序会调用abort函数终止程序     
  6.     std::thread t1(print);    
  7.     std::cout<<"主线程"<

 3.join:加入/汇合线程。阻塞主线程,等待子线程执行结束,可理解为依附功能

  1. #include  
  2. void print() 
  3.  std::cout<<"子线程"<
  4. int main() 
  5.     std::thread t1(print);    
  6.     t1.join();      //阻塞主线程,等待子线程执行结束 
  7.     std::cout<<"主线程"<
  8.     return 0; 

 4.detach:分离,剥离依附关系,驻留后台

  1. #include  
  2. #include  
  3. #include  
  4. void print()  
  5.  for (int i = 0; i < 10; i++)  
  6.  { 
  7.   std::cout << "子线程"<
  8.  } 
  9. int main()  
  10.  std::thread t1(print); 
  11.  std::cout << "主线程" << std::endl; 
  12.     //可用Sleep延时实现结果演示 
  13.  t1.detach(); 
  14.  return 0; 

注意:一旦detach线程后,便不可再使用join线程。

joinable:判断当前线程是否可以join或deatch,如果可以返回true,不能返回false

  1. #include  
  2. #include  
  3. void print()  
  4.  for (int i = 0; i < 10; i++)  
  5.  { 
  6.   std::cout << "子线程"<
  7.  } 
  8. int main()  
  9.  std::thread t1(print); 
  10.  t1.detach(); 
  11.  if (t1.joinable())  
  12.  { 
  13.   t1.join(); 
  14.   std::cout << "可join" << std::endl; 
  15.  } 
  16.  std::cout << "主线程" << std::endl; 
  17.  return 0; 

其他创建线程方法

用类和对象

  1. #include  
  2. #include  
  3. class Function  
  4. public
  5.  void operator()()  
  6.   std::cout << "子线程" << std::endl; 
  7.  } 
  8. }; 
  9. int main()  
  10.  Function object; 
  11.  std::thread t1(object);    //可调用对象即可 
  12.  t1.join(); 
  13.  std::thread t2((Function())); 
  14.  t2.join(); 
  15.  std::cout << "主线程" << std::endl; 
  16.  return 0; 

Lambda表达式

  1. #include  
  2. #include  
  3. int main()  
  4.  
  5.  
  6.  std::thread t1([] {std::cout << "子线程" << std::endl; }); 
  7.  t1.join(); 
  8.  std::cout << "主线程" << std::endl; 
  9.  return 0; 

带引用参数创建方式

  1. #include  
  2. #include  
  3. #include  
  4. void printInfo(int& num)  
  5.  num = 1001; 
  6.  std::cout << "子进程:"<
  7. int main()  
  8.  int num = 0; 
  9.  //std::ref 用于包装按引用传递的值。 
  10.  //std::cref 用于包装按const引用传递的值 
  11.  //error C2672: “invoke”: 未找到匹配的重载函数 
  12.  std::thread t(printInfo, std::ref(num));     
  13.  t.join(); 
  14.  std::cout << "主线程:"<
  15.  return 0; 

带智能指针参数创建方式

  1. #include  
  2. #include  
  3. #include  
  4. void printInfo(std::unique_ptr<int> ptr)  
  5.  std::cout << "子线程:"<
  6. int main()  
  7.  std::unique_ptr<int> ptr(new int(100)); 
  8.  std::cout << "主线程:" << ptr.get() << std::endl;   
  9.  std::thread t(printInfo,std::move(ptr));     
  10.  t.join(); 
  11.  std::cout << "主线程:"<move掉了 
  12.  return 0; 

类的成员函数

  1. #include  
  2. #include  
  3. #include  
  4. class MM  
  5. public
  6.  void print(int& num)  
  7.   num = 1001; 
  8.   std::cout << "子线程:"<
  9.  } 
  10. }; 
  11. int main()  
  12.  MM mm; 
  13.  int num = 10; 
  14.  std::thread t(&MM::print,mm,std::ref(num));     
  15.  t.join(); 
  16.  std::cout << "主线程:"<< num << std::endl; 
  17.  return 0; 

好了,创建线程就介绍到这里,大家可以先练习一下,下章节讲解共享数据访问。

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯