博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解c++多线程(一)
阅读量:5815 次
发布时间:2019-06-18

本文共 1823 字,大约阅读时间需要 6 分钟。

c++的多线程可以充分利用计算机资源,提高代码运行效率。在这里总结了一些多线程应用过程中的基本概念和用法。

一、进程与线程

进程是资源分配和调度的一个独立单位。而线程是进程的一个实体,是CPU调度和分派的基本单位。

一个进程至少拥有一个线程。

在同一个进程中的多个线程的内存资源是共享的,也就是说各线程都可以改变进程中的变量。因此在执行多线程运算的时候要注意执行顺序。

二、并发、并行的概念

并行(parallellism)指的是多个任务在同一时刻同时在执行。

而并发(concurrency)是指在一个时间段内,多个任务交替进行。虽然看起来像在同时执行,但其实是交替的。

三、新建线程

1)简单使用

#include 
#include
using namespace std;void f(){ cout<<"thread 1 is running"<

运行结果

 

2)带函数参数的线程

 当需要向线程函数传递参数时,直接在创建线程时,同时也把参数作为入参传递给线程函数。注意当调用函数的参数为引用参数时,线程调用需要加上ref关键字表示引用。并且线程函数会改变引用的变量值。

void f1(int n){    n++;    cout<<"n = "<< n <

  运行结果为:

 

3)替换线程

void f2(int &n){    n++;    cout<<"n = "<
<

运行结果:

 

4)调用类成员函数

class foo{public:    void bar1(int n)    {        cout<<"n = "<
<

 

四、线程操作

1) join

join的意思就是等待子进程完成,再继续主进程。即使线程在调用join前已经执行完毕,join也是有用的。

void f1(int n){    cout<<"thread "<
<<" is running"<

注意用多个线程同时启动后,实际是并发执行。由cpu的控制台来决定当前调用哪个线程。所以实际运行过程可能会多次交替,线程1 - 线程2 - 线程1 - 线程3 - 线程1.....所以得到的结果是混乱的。

 而每次运行的结果都可能都不一样。

第一次运行结果:

 

第二次运行结果: 

 

假如需要在运行线程t2之前,结果t1,那么就可以在t2之前,执行t1.join()。

void f1(int n){    cout<<"thread "<
<<" is running"<

运行结果:

2)detach

detach操作可以将线程分离,允许线程独立执行。等到线程执行完毕后,系统会自动将资源回收。

void independentThread(){    cout<<"start concurrent thread"<

注意:每个线程要么detach,独立运行,然后系统自动回收资源;要么join,也就是让主线程等待子线程结束之后,主线程将资源回收。

如果两个操作都不执行,可能会出现内存泄漏。

3)线程暂停

如果让线程从外部暂停会引发很多并发问题,这也是为什么std::thread没有直接提供pause函数的原因。如果线程在运行过程中,确实需要停顿,就可以用this_thread::sleep_for。

void threadCaller(){    this_thread::sleep_for(chrono::seconds(3)); //此处线程停顿3秒。    cout<<"thread pause for 3 seconds"<

4)获取当前线程号

int main(){    thread::id main_threadId =  this_thread::get_id();    cout<
<

运行结果: 

 

 

参考:https://www.jianshu.com/p/dcce068ee32b

   https://en.cppreference.com/w/cpp/thread/thread

 

转载于:https://www.cnblogs.com/corineru/p/10847394.html

你可能感兴趣的文章
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
Win配置Apache+mod_wsgi+django环境+域名
查看>>
第四届中国汽车产业信息化技术创新峰会将于6月在沪召开
查看>>
linux清除文件内容
查看>>
WindowManager.LayoutParams 详解
查看>>
find的命令的使用和文件名的后缀
查看>>
Android的Aidl安装方法
查看>>
Linux中rc的含义
查看>>
曾鸣:区块链的春天还没有到来| 阿里内部干货
查看>>
如何通过Dataworks禁止MaxCompute 子账号跨Project访问
查看>>
js之无缝滚动
查看>>
Django 多表联合查询
查看>>
logging模块学习:basicConfig配置文件
查看>>
Golang 使用 Beego 与 Mgo 开发的示例程序
查看>>
ntpdate时间同步
查看>>
+++++++子域授权与编译安装(一)
查看>>
asp.net怎样在URL中使用中文、空格、特殊字符
查看>>
ASA5585-S20测试方案
查看>>
路由器发布服务器
查看>>