python-多线程同步中创建互斥锁解决资源竞争的问题

import threadingimport time

# 定义一个全局变量g_num = 0

def test1(num):    global g_num    for i in range(num):        g_num += 1    print(‘-------in test1 g_num={}‘.format(g_num))

def test2(num):    global g_num    for i in range(num):        g_num += 1    print(‘-------in test1 g_num={}‘.format(g_num))

def main():    t1 = threading.Thread(target=test1, args=(1000000,)) # 测试用一万输出的结果是正确的,但是用一百万就有问题了    t2 = threading.Thread(target=test1, args=(1000000,))

    t1.start()    t2.start()

    # 等待上面两个进程执行的时间    time.sleep(5)    print(‘-------in main Thread g_num={}‘.format(g_num))

if __name__ == ‘__main__‘:    main()

#上面这个程序会造成资源竞争的问题,最后输出的结果为(结果每次会不同,但是一定不是我们的逻辑结果)

-------in test1 g_num=1172278
-------in test1 g_num=1288801
-------in main Thread g_num=1288801

##解决方案如下(红色字体为新添加的代码)

import threadingimport time

# 定义一个全局变量g_num = 0

def test1(num):    global g_num

    for i in range(num):        # 上锁如果之前没有被锁上, 那么此时 上锁成功        # 如果上锁之前 已经被上锁了,那么就会堵塞在这里,直到这个锁被解开        mutex.acquire()        g_num += 1        mutex.release()    print(‘-------in test1 g_num={}‘.format(g_num))

def test2(num):    global g_num

    for i in range(num):        mutex.acquire()        g_num += 1        mutex.release()    print(‘-------in test1 g_num={}‘.format(g_num))

# 创建一个互斥锁,默认是没有上锁的mutex = threading.Lock()

def main():    t1 = threading.Thread(target=test1, args=(1000000,)) # 测试用一万输出的结果是正确的,但是用一百万就有问题了    t2 = threading.Thread(target=test1, args=(1000000,))

    t1.start()    t2.start()

    # 等待上面两个进程执行的时间    time.sleep(5)    print(‘-------in main Thread g_num={}‘.format(g_num))

if __name__ == ‘__main__‘:    main()

原文地址:https://www.cnblogs.com/fuyouqiang/p/11770443.html

时间: 2024-11-06 03:32:21

python-多线程同步中创建互斥锁解决资源竞争的问题的相关文章

python多线程编程(2): 使用互斥锁同步线程

上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的代码: # encoding: UTF-8import threadingimport time class MyThread(threading.Thread): def run(self): global num time.sleep(1) num = num+1 msg = self.name+' set

python多线程同步实例分析

进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发应用等都会涉及到.其开发和调试过程都不直观.由于同步通信机制的原理都是想通的,本文希通过望借助python实例来将抽象概念具体化. 阅读之前可以参考之前的一篇文章:python多线程与多进程及其区别,了解一下线程和进程的创建. python多线程同步 python中提供两个标准库thread和thr

第9章 线程编程(4)_线程同步1:互斥锁

5. 线程的互斥和同步 5.1 同步和互斥的概念 (1)线程同步:是一个宏观概念,在微观上包含线程的相互排斥和线程的先后执行的约束问题.解决同步方式一般采用条件变量和信号量. (2)线程互斥:线程执行的相互排斥(注意,它不关心线程间执行的先后顺序!).解决互斥一般使用互斥锁.读写锁和信号量. [编程实验]银行ATM(线程不安全的例子) //account.h #ifndef __ACCOUNT_H__ #define __ACCOUNT_H__ typedef struct { int code

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

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

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

线程同步:何时互斥锁不够,还需要条件变量?

http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285519.html 线程同步:何时互斥锁不够,还需要条件变量? 很显然,pthread中的条件变量与Java中的wait,notify类似 假设有共享的资源sum,与之相关联的mutex 是lock_s.假设每个线程对sum的操作很简单的,与sum的状态无关,比如只是sum++.那么只用mutex足够了.程序员只要确保每个线程操作前,取得lock,然后sum++,再unlock即可.每个

Python 多线程同步队列模型

Python 多线程同步队列模型 我面临的问题是有个非常慢的处理逻辑(比如分词.句法),有大量的语料,想用多线程来处理. 这一个过程可以抽象成一个叫"同步队列"的模型. 具体来讲,有一个生产者(Dispatcher)一方面从语料中读入句子,并且存入队列中,一方面看有没有空闲的消费者(Segmentor),如果有,就把句子从队列中弹出并交给这个空闲的消费者处理. 然后消费者把处理完成的结果交给生产者输出,生产者要保证输出与输入顺序一致. 消费者是典型的threading,它需要看见生成者

037_go语言中的互斥锁

代码演示: package main import ( "fmt" "math/rand" "runtime" "sync" "sync/atomic" "time" ) func main() { var state = make(map[int]int) var mutex = &sync.Mutex{} var ops int64 = 0 for r := 0; r <

线程同步机制之互斥锁通信机制

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <string.h> void *thread_function(void *arg); pthread_mutex_t work_mutex; #define WORK_SIZE 1024 char work_area[WORK_SIZE]; int time_to_exit=0; int main(int argc,