@

1.同步的概念

同步就是协同步调,按照预定的先后次序进行运行,如你说完我在说

同步在子面上容易理解为一起工作

其实不是,同指的应该是协同,协助,互相合作

如进程,线程同步,可以理解为进程或者线程A,B一块配合

A运行到某一个的阶段依靠B的某一个结果

所以A停下来,让B运行

B执行得到的结果给A,让A在继续操作

2.解决线程同时修改全局变量的方式

使用线程同步思路

线程a调取全局变量的时候,给变量加一把锁

当a执行完然后再释放锁

在上锁的过程中不允许其他的线程访问,就保证了数据的正确性

3.互斥锁

当多个线程同时修改某一个共享数据的时候,需要进行同步控制

最简单的同步机制就是互斥锁

互斥锁为资源引入一个状态:锁定/非锁定

互斥锁保证了多线程情况下数据的正确性

代码实现

import threading

g_num = 0

def test1(num):
global g_num
#上锁,如果之前没有被上锁,那么此时上锁成功
#如果上锁之前 已经被上锁了,那么此时会被堵塞到这里,直到 这个锁被解开为止
mutex.acquire()
for i in range(num):
g_num += 1
#解锁
mutex.release()
print("in test1 gnum = %d" % g_num) def test2(num):
global g_num
mutex.acquire()
for i in range(num):
g_num += 1
mutex.release() print("in test2 gnum = %d" % g_num) #创建一个互斥锁,默认是没有上锁的
mutex = threading.Lock() def main(): t1 = threading.Thread(target=test1,args=(100000000,))
t2 = threading.Thread(target=test2,args=(100000000,)) t1.start()
t2.start() if __name__ == '__main__':
main()

注意

  • 这里在for循环的外面给进程加了锁,循环完毕再给解锁,输出结果是先输出1亿,在输出2亿,毋庸置疑结果正确
  • 把加锁和解锁放在for循环里面,会出现第一个结果和第二个结果几乎同时出现,但是最后的结果是正确的,原因是在执行test1循环的时候计算完然后被test2抢去了,大事计算过程没有被打断,所以结果没有被影响

多任务-python实现-同步概念,互斥锁解决资源竞争(2.1.4)的更多相关文章

  1. python同步、互斥锁、死锁

    目录 同步 同步的概念 解决线程同时修改全局变量的方式 互斥锁 使用互斥锁完成2个线程对同一个全局变量各加9999999 次的操作 上锁解锁过程 总结 死锁 避免死锁 同步 同步的概念 同步就是协同步 ...

  2. 学习Go语言之使用原子访问或互斥锁解决竞态问题

    使用原子访问或互斥锁 // 解决竞态问题 package main import ( "fmt" "sync" "sync/atomic" ...

  3. python 并发编程 多进程 互斥锁 目录

    python 并发编程 多进程 互斥锁 模拟抢票 互斥锁与join区别

  4. 线程同步 - POSIX互斥锁

    线程同步 - POSIX互斥锁 概括 本文讲解POSIX中互斥量的基本用法,从而能达到简单的线程同步.互斥量是一种特殊的变量,它有两种状态:锁定以及解锁.如果互斥量是锁定的,就有一个特定的线程持有或者 ...

  5. java线程共享受限资源 解决资源竞争 thinking in java4 21.3

    java线程共享受限资源 解决资源竞争  具体介绍请參阅:thinking in java4 21.3 thinking in java 4免费下载:http://download.csdn.net/ ...

  6. python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  7. 【Python下进程同步之互斥锁、信号量、事件机制】

    " 一.锁机制:  multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的 ...

  8. UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)

    一.使用互斥锁 1.初始化互斥量 pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量 int pthread_mutex_init( ...

  9. Python中线程与互斥锁

    了解之前我们先了解一下什么是多任务? 概念: 几个不同的事件在同时运行就是多任务, 这样的话, 我们有牵扯到了真的多任务, 假的多任务; 并行: 真的多任务, 通过电脑的核数来确定 并发: 假的多任务 ...

随机推荐

  1. FL Studio音乐编曲入门教程

    有很多小伙伴给我们留言说使用FL Studio20一段时间后,虽然对这款音乐编曲软件的功能有了一个了解,但对它整个的编曲过程还不是太熟悉.所以今天我就给大家带来了FL Studio20这款音乐编曲软件 ...

  2. Edison:FL Studio中的常用音频录制与剪辑插件

    Edison是FL Studio中的一个完全集成的音频编辑和录制工具.Edison加载到效果插槽(在任何调音台音轨中),然后录制或播放该位置的音频.您可以在任意数量的混音器轨道或效果插槽中根据需要加载 ...

  3. Folx专业版任务计划功能详解

    Folx专业版的任务计划功能允许用户以时间表的方式,制定下载计划.按照预先设定的时间计划,Folx会在指定的时间段内,自动开启或停止下载任务. 另外,用户还可以设置自动关机功能.当计划下载任务停止时, ...

  4. kube-flannel.yml 文件

    ---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: flannelrules: - api ...

  5. 多元Huffman编码变形—回溯法

    一.问题描述 描述 在一个操场的四周摆放着n堆石子.现要将石子有次序地合并成一堆.规定在合并过程中最多可以有m(k)次选k堆石子合并成新的一堆,2≤k≤n,合并的费用为新的一堆的石子数.试设计一个算法 ...

  6. C语言讲义——变量的输入

    scanf("%_", &变量); 注意两点: 1.scanf的第一个参数:中只写占位符(%_),不要写别的内容(不是输出给谁看). 2.scanf的第二个参数:要加&am ...

  7. oracle set oracle_sid=xxxxxx

    本地有多个实例,在cmd  输入  set oracle_sid=xxxxx   来指定要连接的实例 sqlplus xxxx/xxxx@1.1.1.1.1/sid   连接数据库

  8. Vmware无法生成本地连接

    打开Vmware使用乌班图 结果发现没有办法连接本地连接,那就是注册表出现了问题 今天推荐一个好软件 然后使用进行清理缓存,重新注册表 然后直接点击虚拟机里面的编辑->虚拟网络编辑器->把 ...

  9. Spring Boot 集成 MQTT

    本文代码有些许问题,处理方案见:解决 spring-integration-mqtt 频繁报 Lost connection 错误 一.添加配置 spring: mqtt: client: usern ...

  10. SAP调用RestfulApi接口POST数据到外部系统

    作者:明光烁亮 出处:http://www.cnblogs.com/hezhongxun/ 微信号:HEme922 欢迎加好友一起交流SAP! 视频资料共享. 本文版权归作者和博客园共有,欢迎转载,但 ...