首页 > 线程互斥和同步-- 互斥锁

线程互斥和同步-- 互斥锁

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


对于互斥锁的一个深层次的理解
1. 互斥锁本身就是一个临界资源,所以对互斥锁的操作本身就是原子的。
2. 每次在线程 函数的内部,每次需要申请锁资源,如果申请失败,当前的线程就会被挂起,挂起就是该线程的PCB在等待队列里面。


死锁产生的情景
1. 多线程可能有多把锁,这个时候,如果其中的某些线程 都想要访问彼此的锁,这个时候可能 都拿不到,然后就产生了死锁。
2. 一个进程一把锁,可能由于代码错误,当它申请锁之后,已经 拿到了这把锁,然后他又去申请同样 的,这个时候就出现了死锁。


下面看代码的实现。

#include
#include
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
",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
",count);return 0;}






更多相关:

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 一、thread的基本用法 参见C++使用thread类多线程编程 。 二、类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。 #include #include #include using namesp...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...

  • 首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,统一...

  • adapterapientityhandleruiuntilwidgetappContent.java *************************************图片:drawable:存放各种位图文件,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable类型的XML文件mipmap-...

  • FROM:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。 网站开发,完全可以采用软...

  •   在网上搜浏览器缓存问题时,遇上了很多问题。一是不知道应该用何种关键字搜索,二是一搜出来,就全是讲的是如何禁用浏览器缓存的方案。   作为大型点的FLASH WEBGAME来说,不缓存显然是不行的。总体上来说,我们要想达到的目标就是 一、浏览器需要缓存 二、当服务器资源更新时,浏览器缓存里相应的老版本资源失效。   下面两篇文章讲到...

  •   读取jar文件内部的配置信息是在进行开发基于java程序组件时必然会遇到的问题,这里所遇到的问题是在开发测试和部署(也就是将程序打成jar包之后供其他组件调用)时往往会不一致。也就是开发的时候我们的代码可以访问到配置文件信息,但是一旦打成jar包之后往往会遇到“FileNotFoundException”,也就是无法找到配置文件...

  • 函数原型 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) 第一个参数为需要等待的条件,第二个参数为互斥锁 一般该函数和 int pthread_cond_signal(pthread_cond_t *cond);函数一同使用,用来唤醒在cond...