@

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. Mac用户好帮手CrossOver:耗时少,效率高

    Mac系统仅适配自己的硬件,它的软件需要通过app store购买,所以很多Mac用户也为之烦恼.这种模式优点是稳定性与性能超强发挥,缺点也显而易见. 那该如何解决这一困扰呢?一般,我们会选择安装虚拟 ...

  2. 攻克弹唱第七课(如何弹奏neon)

    在本期文章中,笔者将通过Guitar Pro 7来跟大家研究一下neon的曲谱,顺便复习一下之前文章中说过的和弦技巧. 在<如何在指板上寻找特殊和弦(二)>这一期课程中,我们分析过如何使用 ...

  3. yii2.0 设置默认路由

    在config/web.php 添加 $config = [ 'defaultRoute' => 'login/login', ];

  4. QQ账号测试用例

  5. python画猫并打包成EXE文件

    因python自带有海龟画图库,尝试给爱猫的小仙女来画个猫咪. 1.代码如下 from turtle import * #两个函数用于画心 def curvemove(): for i in rang ...

  6. CSRF&SSRF-初探准备

    了解CSRF之前的必备知识 1.同源策略 同源策略-三个相同:协议.域名.端口 举例说明: 源URL为:http://www.example.com/dir/page.html 协议为:http 域名 ...

  7. C# Winform TCP发消息

    服务端: 代码: using System; using System.Collections.Generic; using System.IO; using System.Net; using Sy ...

  8. 天池新闻推荐比赛1:赛题理解+baseline

    天池新闻推荐比赛1:赛题理解+baseline 一.比赛信息 比赛链接: ​ https://tianchi.aliyun.com/competition/entrance/531842/inform ...

  9. Linux之centos包管理【rpm】、【yum】、【tar】

    rpm包是二进制格式,无需编译安装便可使用,tar包是源码格式,需要编译安装才可使用 rpm包管理: rpm:redhat package manager,红帽的包管理器,其主要的操作参数有如下: - ...

  10. 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解

    前面一节介绍了构造方法定义的语法,并进行了语法解释说明,本节将通过案例来说明构造方法参数传递及返回值的情况. 一.    案例说明 本节定义一个汽车类,它有四个实例变量:wheelcount, pow ...