首页 > 其他分享 >互斥锁

互斥锁

时间:2023-07-29 12:34:09浏览次数:28  
标签:__ thread threading 互斥 num 线程

在Python中,可以使用互斥锁(Mutex)来实现线程之间的互斥访问,保证共享资源的安全性。互斥锁可以确保在任何时刻只有一个线程可以持有锁,并且其他线程必须等待锁的释放才能继续执行。

步骤

1. 创建互斥锁对象:

lock = threading.Lock()

通过threading.Lock()函数创建一个互斥锁对象。

2. 获取互斥锁:

lock.acquire()

调用acquire()方法获取互斥锁。如果互斥锁已经被其他线程占用,则当前线程将被阻塞,直到互斥锁被释放。

3. 释放互斥锁:

lock.release()

示例

 1 import threading
 2 
 3 # 全局变量
 4 g_num = 0
 5 
 6 
 7 # 对g_num进行加操作
 8 def sum_num1():
 9     # 上锁
10     mutex.acquire()
11 
12     for i in range(1000000):
13         global g_num
14         g_num += 1
15 
16     # 解锁
17     mutex.release()
18 
19     print("g_num1:", g_num)
20 
21 
22 # 对g_num进行加操作
23 def sum_num2():
24     # 上锁
25     mutex.acquire()
26 
27     for i in range(1000000):
28         global g_num
29         g_num += 1
30 
31     # 解锁
32     mutex.release()
33 
34     print("g_num2:", g_num)
35 
36 
37 if __name__ == '__main__':
38     # 创建锁
39     mutex = threading.Lock()
40     # 创建子线程
41     sum1_thread = threading.Thread(target=sum_num1)
42     sum2_thread = threading.Thread(target=sum_num2)
43 
44     # 启动线程
45     sum1_thread.start()
46     sum2_thread.start()
47     # 等待子线程结束
48     sum1_thread.join()
49     sum2_thread.join()
50     print(f"g_num最终值:{g_num}")

输出:


g_num1: 1000000
g_num2: 2000000
g_num最终值:2000000

推荐示例-with语句

 1 '''
 2 在Python中,可以使用互斥锁(Mutex)来实现线程之间的互斥访问,保证共享资源的安全性。
 3 互斥锁可以确保在任何时刻只有一个线程可以持有锁,并且其他线程必须等待锁的释放才能继续执行。
 4 
 5 互斥锁使用3步骤:  推荐使用with语句
 6     1. 创建互斥锁对象
 7     2. 获取互斥锁
 8     3. 释放锁
 9 
10 '''
11 import threading
12 
13 # 全局变量
14 count = 0
15 # 1. 创建互斥锁对象,定义未全局变量,让多线程共享。要保证上的是同一把锁,否则锁不住
16 lock = threading.Lock()
17 
18 # 线程函数
19 def increment():
20     global count
21     for _ in range(100000):
22         with lock:  # 自动上锁、解锁
23             count += 1
24 
25 if __name__ == '__main__':
26     # 创建两个线程
27     thread1 = threading.Thread(target=increment)
28     thread2 = threading.Thread(target=increment)
29 
30     # 启动线程
31     thread1.start()
32     thread2.start()
33 
34     # 等待线程结束
35     thread1.join()
36     thread2.join()
37 
38     # 打印最终结果
39     print("Final count:", count)

 

标签:__,thread,threading,互斥,num,线程
From: https://www.cnblogs.com/allenxx/p/17589637.html

相关文章

  • Java并发(十四)----悲观互斥与乐观重试
    1.悲观互斥互斥实际是悲观锁的思想例如,有下面取款的需求interfaceAccount{  //获取余额  IntegergetBalance();​  //取款  voidwithdraw(Integeramount);​  /**  *方法内会启动1000个线程,每个线程做-10元的操作  *如......
  • java 互斥条件判断
    Java互斥条件判断作为一名经验丰富的开发者,我将教你如何在Java中实现互斥条件判断。在这篇文章中,我将向你展示实现步骤,并提供每个步骤所需的代码和注释。实现步骤以下是实现互斥条件判断的整个流程。我们将按照这个步骤逐步进行实现。步骤描述步骤1定义一个对象作为......
  • linux9 互斥锁 死锁 读写锁 条件变量 信号量
    1.linux9day1.线程竞争![01-打印机模型](I:\9day\01-打印机模型.png)2.同步和互斥互斥同一时刻只能一个进程或线程使用多个进程或线程不能同时使用同步:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特......
  • rtthread_互斥量
    1互斥量  互斥量即互相排斥的信号量,是一种特殊的二值信号量;只能由持有线程释放,而信号量则可以由任何线程释放;  拥有互斥量的线程拥有互斥量的所有权,互斥量支持递归访问且能防止多线程优先级翻转;  1.1线程优先级翻转问题    互斥量通过继承线程优先级,将持有互斥量......
  • GIL锁,互斥锁
    一、GIL锁1、全局解释器锁(GlobalInterpreterLock,简称GIL)GIL是一种用于保护Python解释器在多线程环境下的数据完整性的机制。GIL只存在是CPython解释器中,即官方的Python解释器实现GIL是一个互斥锁,你可以使用多线程来并发处理任务,但在同一时刻只能有一个线程......
  • 韦东山freeRTOS系列教程之【第四章】同步互斥与通信
    文章目录系列教程总目录概述4.1同步与互斥的概念4.2同步与互斥并不简单4.3各类方法的对比系列教程总目录本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的目录列表,目录列表页面地址:javascript:void(0)概述本章是概述性的内容。可以把多任务系统当做一个团队,......
  • Linux多线程09-互斥锁
    为避免线程更新共享变量时出现问题,可以使用互斥量(mutex是mutualexclusion的缩写)来确保同时仅有一个线程可以访问某项共享资源。可以使用互斥量来保证对任意共享资源的原子访问。互斥量有两种状态:已锁定(locked)和未锁定(unlocked)。任何时候,至多只有一个线程可以锁定该互斥量。试......
  • std::thread 二:互斥量(lock() & unlock())
     mutex 互斥量的作用是保护共享数据*:有lock() 就一定要有 unlock()#include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;i<10000;i++)......
  • std::thread 二:互斥量(lock_guard())
    *:使用lock_guard后,就不可以使用lock()和unlock()*:lock_guard和智能指针一样,会自动解锁 #include<iostream>#include<thread>#include<mutex>#include<list>usingnamespacestd;classA{public:voidinNum(){for(inti=0;......
  • std::thread 二:互斥量(多个互斥量的解决方法)
     //*:这里的lock是函数模板,最少传两个互斥量//第一种,使用lock和unlockstd::mutexm_mutex1;std::mutexm_mutex2;std::lock(m_mutex1,m_mutex2);m_mutex1.unlock();m_mutex2.unlock();//第二种,使用lock和lock_guardstd::mutexm_mutex1;std::mutexm_m......