同步锁/互斥锁

互斥锁:是为了避免多个线程抢夺资源造成数据不准确问题而提出的,是为了限制同一时刻多个线程访问同一个数据.

首先需要了解两个概念:

1>多线程并发执行:我们都知道,如果不涉及两个线程之间传值或是共享资源的时候,多个线程之间是没有交集的,你走你的阳关道我走我的独木桥, 井水不犯河水,但是如果需要传值或是共享资源两个线程之间就有了碰头的机会.所以又出了一个线程同步的概念.

2>多线程同步执行:如果单从字面理解很难说清楚有什么区别,都是说多个线程在同一时刻各自做各自的事情,本来不同线程之间就没有什么关系, 这是多线程产生的意义.从多线程产生的意义来说,这个"同步执行"是不正常的!什么意思呢>本来都是独立的线程没有所谓的先后的顺序的,可是这个同步执行,就要求线程之间要有个顺序,所以他是非自然的,是人为扭曲的线程状态.我们通过代码来实现的多线程之间有序的执行的假象

好的我来多个比喻,比如两个中国人一个在南方一个在北方不认识没交集,两个人各自独立的生活,没什么关系,但是他们都要从北京飞到上海,且坐了同一班飞机,假设一次只能有一个人过安检,这个时候就要有个先后顺序,所以安检就是一把锁,这就是同步执行的一个场景,还有其他场景像之前文章写的断点续传,也是多线程碰面的场景,这个比喻与下面说的同步锁的场景有点不贴切,我是着重说了一下多线程碰面的场景,自己体会一下.上代码,程序是模拟多个窗口卖票的过程.

##还有那个锁不能加到循环外面:单说程序也不好说,我还是做个比喻,你家有三个卧室,你的目的是不然人进入你老婆的房间,你只要把你老婆卧室的门锁上就可以了,不是把房门锁上,那样客厅和其他卧室都不能进人了!

时间: 2024-08-11 01:15:35

同步锁/互斥锁的相关文章

Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例子 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

线程锁(互斥锁Mutex)

线程锁(互斥锁Mutex) 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? # -*- coding:utf-8 -*- import threading import time num = 100#设定一个共享变量:num=100在主线程中,我想要在子线程中修改num def run(n): global num#在函数里修改函数外变量,首先应该声明为全局变量,在每个线程中都获取这个全局变

线程同步(互斥锁与信号量的作用与区别)

“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源.比如对全局变量的访问,有时要加锁,操作完了,在解锁.有的时候锁和信号量会同时使用的” 也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后

APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量

线程同步 同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性. 假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定是i=2:其实不然,如果没有考虑线程同步,i的取值可能是1.我们先考虑自加操作的过程:a,首先将内存中i的值copy到寄存器:b,对寄存器中i的copy进行自加:c,将寄存器中自加的结果返回到内存中.回到例子,如果线程A执行完abc三个步骤,线程B在执行者三个步骤,那么结果就应该为2.但是自加不是原子操作,假如执行

Linux-线程同步之互斥锁

1.互斥锁又叫互斥量(mutex) 2.相关函数:pthread_mutex_init  pthread_mutex_destroy   pthread_mutex_lock pthread_mutex_unlock 3.互斥锁与信号量的关系:可以认为互斥锁是一种特殊的信号量 4.互斥锁主要用来实现关键段的保护 提示:man  3 pthread_mutex_init时提示找不到函数,说明你没有安装pthread相关的man手册. 安装方法:1.虚拟机上网: 2.sudo   apt-get  

win32进阶必备:多线程同步之互斥锁

应用多线程互斥锁之前首先简单过一下C程序可能用到的3个创建线程函数: CreateThread,windows系统提供的唯一创建线程API,_beginthread和_beginthreadex都在内部调用了CreateThread,直接调用该函数创建多线程的C程序存在内存泄露的可能性,通常不推荐直接使用,创建多线程应用程序时以_beginthreadex替代,详细原因下面讲解. _beginthread,最初版的C运行时库多线程创建函数,参数过少,存在一些天然的缺陷,无法创建具有运行安全属性的

递归锁+条件锁+互斥锁-04-多线程

1 // 2 // ViewController.m 3 // 05-递归锁(recursive)+条件锁(condition) 4 // 5 // Created by mac on 16/4/20. 6 // Copyright © 2016年 mac. All rights reserved. 7 // 8 /* 9 10 3). 互斥锁 11 NSLock *_lock; 12 13 3)NSLock :不能多次调用,会产生死锁 14 15 2016-04-20 16:06:44.600

线程—同步之互斥锁

线程互斥:实质某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性. import threading import time g_lock = threading.Lock() def func(): global tmp global g_lock g_lock.acquire() for i in range(20,40): tmp = i] print "%s:tmp = %d"%(threading.currentThread(),getName(),tmp) tim

Linux环境编程之同步(一):互斥锁

同步的内容在<UNP2>里把它看作了进程间通信,我觉得其实同步只是进程间通信的一种协作方式一种协作的手段,不能称之为进程间通信的一种形式,所以标题用了"同步",而没有用IPC进程间通信. 互斥锁是同步的基本组成部分,它们总是用来同步一个进程内的各个线程的.如果互斥锁或条件变量存放在多个进程间共享的某个内存区,那么Posix还允许它用于这些进程间的同步. 互斥锁用于保护临界区以保证任何时刻只有一个线程在执行其中的代码,或者任何时刻只有一个进程在执行其中的代码.保护临界区的代码