公司网站建设需要资质,沉默是金 张国荣,邯郸网站建设浩森宇特,长沙住房和城乡建设部网站互斥#xff1a;一个厕所坑位只能一次蹲一个人#xff0c;其他人只能在门外#xff0c;已经占有的人对其他人来说就是互斥。 同步#xff1a;流水线上#xff0c;一个人给手机按了电池#xff0c;放在流水线上#xff0c;另一个人拿来盖上盖子#xff0c;后面一个人再拧…互斥一个厕所坑位只能一次蹲一个人其他人只能在门外已经占有的人对其他人来说就是互斥。 同步流水线上一个人给手机按了电池放在流水线上另一个人拿来盖上盖子后面一个人再拧上螺丝这几个人的工作就是同步的。 互斥和同步在操作系统的概念中的被称为锁和信号量。其中信号量发送和接收不一定要在一个线程中。 读写锁读的时候大家都可以一起读写得时候只能一个人写就比如隔着玻璃罩的商品大家都可以看但是如果要更换玻璃罩里的东西就把门关了一个人换换好了打开门大家又都可以看了。 自旋锁一个资源被其他人占用了那么我只能在这里等待就像在门外等着上厕所的人等的原地打转所以叫自旋锁。 可重入锁这个线程被我锁住那么我可以多次进入这个锁但被人不可以进入。
线程同步使用互斥锁进行线程同步当一个资源被两个线程访问时可以把这个两个线程访问这个资源的代码段放入临界区也就是用互斥锁锁住这样当一个线程在访问时另一个到达临界区就会被阻塞住直到前一个线程出临界区解锁后阻塞状态就会被激活继续执行。这样将线程串行访问临界区的操作叫做线程同步。 死锁在多线程访问临界区资源时临界区资源被互斥或者其他同步锁锁住如果一个线程进去临界区出来的时候没有解锁这样下次它自己进不去自己的临界区别的线程进去自己的临界区访问这个资源时也进不去所有访问这个资源的线程都别阻塞在自己的临界区之外这就是线程死锁。
读写锁是互斥锁的升级在linux系统接口中(#includepthread.h)它的类是pthread_rwlock_t互斥锁是pthread_mutex_t。读写锁有以下三个特点 1.当多个线程同时读被锁锁住的资源时他们是并行的。 2.当多个线程同时写被读写锁锁住的资源时他们是串行的。 2.当n个线程同时访问被读写锁锁住的资源另外同时也有m个线程要读这个资源时写的线程优先n个线程写的顺序随机当n个线程串行写好后m个线程才一起去读读是并行的。 如果资源只是写读写锁和互斥锁区别不大如果还需要大量的读推荐用读写锁。 读写锁使用有四个步骤初始化加锁解锁销毁。其中用函数给pthread_rwlock_t的对象加锁分为加读锁函数和加写锁函数两种。 如果被写锁函数锁定了那么执行读锁函数时就会阻塞。 如果被读锁函数锁定那么再执行读锁函数时就不会被阻塞。 不管锁定了读操作还是写操作当执行写锁函数时都会被阻塞。
条件变量的使用场景互斥锁和写锁可以实现线程同步但条件变量不可以那么为什么使用了锁还要使用条件变量呢让情况变得复杂这是因为条件变量主要是处理生产者和消费者的情况。生产消费模型需要条件变量配合着锁一起搭建其中锁的作用就是同步。linux系统接口中信号量和锁同一个头文件(#includepthread.h) pthread_mutex_lock(mutex); pthread_cond_wait(cond, mutex);//此时会先解锁然后阻塞当接收到信号量不再阻塞后会再把锁加上。
推荐一套音视频免费课程笔者听完了nice免费报名可听 免费音视频课程连接点击此处
参考丙哥