C++线程操作
admin
2024-02-26 21:01:02
0

文章目录

  • 一、线程和进程的基本概念
  • 二、C++中的线程
  • 三、互斥量mutex的使用
  • 四、条件变量condition_variable的使用
  • 五、线程的其他使用


一、线程和进程的基本概念

 
线程是操作系统进行运算调度的基本单位,进程是操作系统进行资源分配的基本单位。
不同进程分配不同的内存区域,同一个进程中的不同线程共享同一片内存。
 
线程的不同状态:

  1. 新建状态:仅仅是语言层面创建了线程状态,但是还没有与操作系统线程进行关联;
  2. 就绪状态:线程已经与操作系统相关联,可以被CPU进行调度;
  3. 运行状态:线程正占用着CPU,正在运算;
  4. 阻塞状态:等待被唤醒的状态;
  5. 终止状态:线程运行结束。

并行(Parallel)是真正意义上的同时运行,在同一时间点有多个程序在同时运行,比如多核CPU多个核同时运行着不同的程序。并发(ConCurrent)是在同一个时间段上多个程序同时运行,在宏观上看是同时运行,微观上是交替运行。
 
之所以设计多线程是为了充分的利用CPU资源,比如线程A正在等待磁盘数据的时候,可以将CPU让出来,线程B就能占用CPU进行计算。
 

二、C++中的线程

 
c++11新增了与操作系统无关的线程类thread,使用方法如下:

void func(int i) {cout << i << endl;
}int main() {thread t1(func, 10);  //传入线程绑定的函数和函数所需参数t1.join();return 0;
}

thread对象创建之后,线程就已经进入就绪态,可以占用CPU进行运算。
线程的运行需要以具体的函数作为入口,而函数的参数传递无非值传递,引用传递和指针传递3种形式,值传递和指针传递没什么好说的,直接复制值或者指针放入线程入口函数中,而线程的使用中需要特别注意⚠️⚠️⚠️引用传递,普通函数使用引用传递,底层使用的还是指针,所以函数中的引用会关联到函数外的变量。但是在线程的使用中,函数引用传递是引用的复制,函数中的引用和函数外的值没有关联关系。
 
join()detach()的用法:调用线程的join()方法意味着,主线程会阻塞在该语句处,等待子线程运行结束的时候才会继续运行主线程,而detach()方法意味着,子线程从主线程中分离出来各自运行,子线程变为后台守护线程(deamon thread),如此这般,子线程可能会结束在主线程之后,可能会出现不可预知的问题。
 

三、互斥量mutex的使用

 
当存在多个线程共同访问同一资源(比如队列)的时候,如果操作的顺序不当可能会出现不可预知的错误,该资源成为临界资源,此时C++使用互斥量mutex进行资源访问的控制。
 
通常为了方便理解多线程操作,我们将mutex称为锁🔒,对资源的访问称为对资源上锁和解锁。实际上mutex是一个标记量,不同的线程对同一mutex对象进行lock()unlock()可以达到控制资源访问次序的目的。
 
lock()方法是尝试获取锁并加锁,如果获取不到锁,线程就会阻塞在此语句处,mutex调用了lock()就必须unlock(),否则就有可能是其他线程不能成功lock()而一直阻塞。
为了解决这种可能忘记unlock()的问题,引入lock_guard模版类,lock_guard类似于智能指针,出作用域会自动unlock()。和lock_guard相似的一个模版类是unique_lock,使用方法和lock_guard类似。
 

四、条件变量condition_variable的使用

 
多个线程需要通信的时候会用到cv,比如消费者和生产者线程模型,这两个线程并不是单单的对资源解锁和加锁。而是需要通信,比如,消费者没有资源可以消费的时候需要将生产者叫醒。
 
cv有两个方法wait()wait_for()wait方法会让当前线程释放锁然后阻塞,直到被唤醒;wait_for方法需要传递一个时间参数,当前线程释放锁然后等待被唤醒,但是不会一直等待,而是吵过时间参数自动苏醒。
cv还有两个方法notify_one()notify_all()notify_one会唤醒线程等待队列的第一个线程,而notify_all会唤醒所有等待的线程。
 
waitsleep方法的区别:

  1. waitcv的方法,sleepthis_thread的方法;
  2. wait会释放锁然后再阻塞,而sleep直接阻塞,不会释放锁。

 

五、线程的其他使用

  1. wait被唤醒之后第一件事是会反复尝试直到拿到锁再往下执行,wait被唤醒拿到锁之后一般还要再次检查阻塞条件保证多线程共享的正确性;
  2. unique_lock所有权的转移类似于unique_ptr,使用move进行所有权转移;
  3. std::lock(mutex1, mutex2)方法可以尝试同时锁住多个互斥量,如果有一个没锁成功,就不会对任何互斥量进行加锁;
  4. release()方法将unique_lockmutex解绑,并返回之前绑定的mutex
  5. 互斥量mutexlock()unlock()之间包裹的语句多少称为锁的粒度,粒度要合适,如果太小可能不能达到上锁的预期,如果太大,会降低多线程运行效率;
  6. std::adopt_lock可以传递给lock_guardunique_lock的构造函数,表示这个互斥量已经被lock了(你必须要把互斥量提前lock了 ,否者会报异常);std::adopt_lock标记的效果就是假设调用一方已经拥有了互斥量的所有权(已经lock成功了);通知lock_guard不需要再构造函数中lock这个互斥量了。unique_lock也可以带std::adopt_lock标记,含义相同,就是不希望再unique_lock的构造函数中lock这个mutex。用std::adopt_lock的前提是,自己需要先把mutex lock上;用法与lock_guard相同;
  7. std::try_to_lock会尝试用mutex的lock去锁定这个mutex,但如果没有锁定成功,也会立即返回,并不会阻塞在那里,用这个try_to_lock的前提是你自己不能先lock;
  8. std::defer_lock的前提是,你不能自己先lock,否则会报异常,std::defer_lock的意思就是并没有给mutex加锁,初始化了一个没有加锁的mutex

相关内容

热门资讯

安卓系统原理和内部机制,系统原... 你有没有想过,那个陪伴你每天刷微博、看视频、玩游戏的小家伙——你的安卓手机,它里面到底是怎么运作的呢...
设备刷安卓系统教程图解,设备刷... 你有没有想过,让你的设备焕然一新,体验一下安卓系统的魅力呢?别担心,今天我就要手把手教你如何给设备刷...
小天才平板安卓系统吗,安卓系统... 你有没有听说过小天才平板呢?这款产品最近可是火得一塌糊涂,尤其是它的安卓系统,更是让人津津乐道。今天...
安卓系统8.1代号,系统革新与... 你知道吗?最近在科技圈里,安卓系统8.1的代号可是引起了不小的轰动呢!这款系统代号叫做“奥利奥”,听...
安卓系统下拉框闪现,安卓系统下... 你有没有遇到过这种情况?手机屏幕上突然闪现一个下拉框,让你瞬间感到困惑又好奇。没错,说的就是安卓系统...
智能钥匙管理柜安卓系统,智能钥... 你有没有想过,家里的钥匙太多,每次出门都要翻箱倒柜,真是头疼不已?别急,今天就来给你介绍一个神器——...
安卓手机升级系统好吗?,体验升... 你有没有发现,你的安卓手机最近总是弹出来升级系统的提示?是不是有点犹豫,不知道升级系统到底好不好呢?...
安卓原生系统清缓存软件,安卓原... 手机用久了是不是感觉越来越卡?别急,今天就来给你揭秘一款神奇的小工具——安卓原生系统清缓存软件!它就...
安卓权限设置不让重置系统,安卓... 你有没有遇到过这种情况:手机里的安卓系统突然闹脾气,怎么重置都不行?别急,今天就来给你详细解析为什么...
苹果x有安卓系统吗,跨界融合的... 你有没有想过,苹果X这款手机竟然也有安卓系统的可能性?是的,你没听错,就是那个以iOS系统著称的苹果...
安卓机无法修改系统时间,探究原... 最近发现了一个让人头疼的小问题,那就是安卓机居然无法修改系统时间!这可真是让人摸不着头脑,毕竟我们生...
怎么把安卓系统刷ios系统更新... 你有没有想过,把你的安卓手机换成iOS系统,体验一下苹果的优雅和流畅呢?别急,别急,我来告诉你怎么把...
安卓系统玩天选者,天选者手游攻... 你有没有想过,在安卓系统上玩《天选者》这款游戏,竟然能带来如此多惊喜和挑战呢?没错,今天就要来和你聊...
安卓系统被攻击视频 最近在网络上可是掀起了一阵不小的风波呢!你有没有听说,安卓系统竟然被攻击了?没错,就是那个我们每天离...
苹果ios系统和安卓系统的差别... 你有没有发现,手机圈里总是热闹非凡,尤其是苹果iOS系统和安卓系统这两大巨头,它们就像是一对欢喜冤家...
安卓系统5.0手机,新一代智能... 你有没有发现,最近安卓系统5.0的手机越来越受欢迎了呢?这不,我就买了一部,简直爱不释手!今天,就让...
安卓手机安装最新系统,畅享最新... 亲爱的手机控们,你是不是也和我一样,对安卓手机的新系统充满了期待呢?每当新系统发布,我们就像发现了新...
手机系统只有安卓和苹果,两大手... 你有没有发现,现在的手机世界好像就只剩下两种系统在打架?没错,就是安卓和苹果!这两种系统就像江湖上的...
安卓系统防范的意义,安卓系统防... 你知道吗?在这个科技飞速发展的时代,手机已经成为了我们生活中不可或缺的一部分。而手机中,安卓系统更是...
这个符号安卓系统怎么打,打造个... 你是不是也遇到了这个让人头疼的问题:这个符号安卓系统怎么打?别急,今天就来给你详细解析让你轻松搞定这...