一. 线程分离
我们一般创建的线程是可结合的,这个时候如果我们调用pthread_jion()去等待的话,这种等待的方式是阻塞式等待,如果主线程一直等待,主线程就无法做其他的事情了,所以应该使用线程分离,让子线程由操作系统回收,主线程就不管了。
不管线程是否分离,它始终是在进程的内部执行的。
使用的函数接口是pthread_detach(pthread_t pid)
如果分离自己参数为pthread_self(),如果是主线程分离子线程,参数为pthread_id
二. 线程互斥
因为我们的多个线程是共享一个资源的,这个资源就是临界资源,多个线程对资源的访问就需要使用线程的同步和互斥
互斥,对资源的访问时串行的,原子的。即是,每次只能有一个线程访问临界 资源。
三.线程同步
如果我们的某一个线程的优先级特别高,那么它可能会一直占据这这临界资源,这个时候,其他的线程就无法使用这个临界资源,虽然我们实现了线程的互斥,但是只有一个线程 使用它,这也是不符合我们的实际需求的,所以这个时候需要使用线程的同步。
线程同步的意思就是说,每次使用完一个临界资源之后,都需要排队,打个形象的比喻就是,如果我们一个人进入一个单独自习室自习之后,出来的时候,必须排在其他的排在门口的人后面,不能直接出来又进去,这样的话,他就是一直占据着临界资源了。
四. 互斥锁
设置一个互斥锁,这个时候一次,创建一个全局的互斥锁。
在线程函数里面,每次一个线程 访问的临界资源的时候,首先要做的是就是获取这个锁,只有拿到锁之后才能对临界资源进行操作,然后每次在退出临界资源之前,要解锁,这样其他的线程进入的时候才不会永远拿不到锁。
整个函数结束前,要销毁锁。
对于互斥锁的一个深层次的理解
1. 互斥锁本身就是一个临界资源,所以对互斥锁的操作本身就是原子的。
2. 每次在线程 函数的内部,每次需要申请锁资源,如果申请失败,当前的线程就会被挂起,挂起就是该线程的PCB在等待队列里面。
死锁产生的情景
1. 多线程可能有多把锁,这个时候,如果其中的某些线程 都想要访问彼此的锁,这个时候可能 都拿不到,然后就产生了死锁。
2. 一个进程一把锁,可能由于代码错误,当它申请锁之后,已经 拿到了这把锁,然后他又去申请同样 的,这个时候就出现了死锁。
下面看代码的实现。

#include<stdio.h>
#include<pthread.h>
int count = 0; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;   //创建一把锁,使用宏进行初始化void* pccount(void* arg)
{int i = 0;int temp = 0;while(i<50000000){pthread_mutex_lock(&lock);   //加锁,如果锁资源是空,就拿到锁,如果锁资源不是空,就挂起等待//  temp=count;count=count+1;//printf("%d",temp);i++;pthread_mutex_unlock(&lock);   //操作完临界资源之后,要解锁,这样其他的线程才能够获取锁资源}
//  printf("%d\n",count);pthread_exit((void*)123);
}int main()
{pthread_t pid1;pthread_t pid2;int i = pthread_create(&pid1,NULL,pccount,NULL);int m = pthread_create(&pid2,NULL,pccount,NULL);void* join1;void* join2;pthread_join(pid1,&join1);pthread_join(pid2,&join2);  //这里必须要有线程等待,不然没有打印结果pthread_mutex_destroy(&lock);   //销毁锁资源printf("%d\n",count);return 0;}

线程互斥和同步-- 互斥锁相关推荐

  1. Linux c线程间的同步----互斥锁、条件变量、信号量

    线程 一个进程中的所有线程共享为进程分配的地址空间.所以进程地址空间中的代码段和数据段都是共享的. 如果定义一个函数在各个线程中都可以调用,定义一个全部变量,在各个线程中都可以访问到. 各线程共享资源 ...

  2. Linux学习06——线程控制与同步互斥

    概述 学习目标: 理解线程概念和并发特征,分辨线程与进程的区别与联系 掌握多线程应用编程技术,掌握线程间数据传递基本方法 掌握共享变量识别方法,理解多线程访问共享变量可能带来的问题 理解临界资源.临界 ...

  3. BCB线程的互斥与同步

    线程的互斥与同步     互斥控制是为了避免一个线程在使用某一个对象或全局变量与其他线程发生冲突.实现线程互斥的方法有: (1)   访问代码委托给VCL主线程执行.在线程中若要调用可视化的方法或访问 ...

  4. windows多线程同步互斥--总结

    2019独角兽企业重金招聘Python工程师标准>>> 秒杀多线程面试题系列 参考JustDoIT -- 大部分内容 <Windows核心编程>线程同步对象速查表 对象 ...

  5. 【学习笔记】第二章——信号量机制 用信号量实现互斥、同步

    文章目录 一. 信号量机制 整型信号量 记录型信号量 例子: 总结 二. 用信号量实现互斥.同步 互斥 同步 前驱 总结 一. 信号量机制 信号量:一个用于表示系统中某种资源的数量的变量(整数 or ...

  6. java 同步锁_java线程中的同步锁和互斥锁有什么区别?

    在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别.概念上的区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执 ...

  7. 线程同步(互斥锁、条件、读写锁、信号量)

    参考:(四十三)线程--线程同步(互斥锁.读写锁.条件变量.信号量) 作者:FadeFarAway 发布时间:2017-01-17 21:25:28 网址:https://blog.csdn.net/ ...

  8. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...

  9. java 多线程(四)—— 线程同步/互斥=队列+锁

    同步.异步.互斥的区别 在很多文章中,直接把同步缩小为互斥,并称之为同步.下面也是这样的. 一.线程同步 = 队列 + 锁 同步(这里说的其实是互斥)就是多个线程同时访问一个资源. 那么如何实现? 队 ...

最新文章

  1. K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?
  2. linux下VNC配置详解
  3. [转] android 中 pinyin4j的使用
  4. 北京python培训班价格-北京Python培训班,为什么Python超适合小白学习
  5. 学习org-mode
  6. QTableview 获取鼠标坐标的item(QModelIndex)
  7. 第五周实践项目7 后缀表达式
  8. mysql系统文件路径修改不了_MySQL数据库改路径后没办法启动的问题
  9. linux oracle 01157,Oracle数据库启动时出现ORA-01157和ORA-01110问题
  10. pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐
  11. BI报表分析和数据可视化,推荐这三个开源工具!
  12. el表达式 多条件判断
  13. 数据分析第二章确定分析思路
  14. UG软件使用10大技巧,将会大大提升工作效率
  15. 网络编程入门(代码很详细)
  16. 经典管理学定律3 - 鳄鱼法则
  17. H5 iframe标签的用法
  18. 制作小地图MiniMap小结
  19. 【Marvelous Designer 1】初学MD
  20. window下使用vnc远程登录linux图形界面和运行应用程序 和odroid Xu4开发板的使用和视频接口VGA、DVI、HDMI的联系

热门文章

  1. 20160203.CCPP体系详解(0013天)
  2. asp.net httpmodule 访问页面控件 备忘
  3. NodeJS+Mongodb+Express做CMS博客系统
  4. CakePHP中出现persistent is not writable等Warning的解决方法
  5. 第18章:MYSQL分区
  6. STL vector list deque区别与实现
  7. flask异步操作_Python Flask后端异步处理(三)
  8. unity人物旋转移动代码_Unity3D研究院之脚本实现模型的平移与旋转(六)
  9. 《introduction to information retrieval》信息检索学习笔记3 词典和容错式检索
  10. OpenCV+python:圆检测