65 - 请解释什么是线程锁,以及如何使用线程锁

举报
ruochen 发表于 2021/03/28 01:49:48 2021/03/28
【摘要】 请解释什么是线程锁,以及如何使用线程锁 线程锁: 目的是将一段代码锁住,一旦获得锁权限,除非释放线程锁,否则其他任何代码都无法获得锁权限为什么需要线程锁 多线程同时在完成特定的操作时,由于并不是原子操作,所以在完成操作的过程中可能会被打断,去做其他的操作可能产生脏数据例如,一个线程读取变量n 【初始值是0】,然后n++, 最后输出n,当访问n++后,被打断,由另外的线...

请解释什么是线程锁,以及如何使用线程锁

  • 线程锁: 目的是将一段代码锁住,一旦获得锁权限,除非释放线程锁,否则其他任何代码都无法获得锁权限
  • 为什么需要线程锁
    • 多线程同时在完成特定的操作时,由于并不是原子操作,所以在完成操作的过程中可能会被打断,去做其他的操作
    • 可能产生脏数据
    • 例如,一个线程读取变量n 【初始值是0】,然后n++, 最后输出n,当访问n++后,被打断,由另外的线程做同样的工作,这时n被加了2次,所以n最后等于2,而不是1
from atexit import register
from threading import Thread, Lock, currentThread
from time import sleep, ctime
import random

lock = Lock()
print(type(lock))

def fun(): lock.acquire()  # 加锁 for i in range(5): print('Thread Name', '=', currentThread().name, 'i', '=', i) sleep(random.randint(1, 5)) lock.release()  # 释放锁 def main(): for i in range(3): Thread(target=fun).start() @register
def exit(): print('线程执行完毕: ', ctime()) main()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
<class '_thread.lock'>
Thread Name = Thread-13 i = 0
Thread Name = Thread-13 i = 1
Thread Name = Thread-13 i = 2
Thread Name = Thread-13 i = 3
Thread Name = Thread-13 i = 4
Thread Name = Thread-14 i = 0
Thread Name = Thread-14 i = 1
Thread Name = Thread-14 i = 2
Thread Name = Thread-14 i = 3
Thread Name = Thread-14 i = 4
Thread Name = Thread-15 i = 0
Thread Name = Thread-15 i = 1
Thread Name = Thread-15 i = 2
Thread Name = Thread-15 i = 3
Thread Name = Thread-15 i = 4

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
from atexit import register
from threading import Thread, Lock, currentThread
from time import sleep, ctime
import random

lock = Lock()
print(type(lock))

def fun(): # lock.acquire()  # 加锁 for i in range(5): print('Thread Name', '=', currentThread().name, 'i', '=', i) sleep(random.randint(1, 5)) # lock.release()  # 释放锁 def main(): for i in range(3): Thread(target=fun).start() @register
def exit(): print('线程执行完毕: ', ctime()) main()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
<class '_thread.lock'>
Thread Name = Thread-16 i = 0
Thread Name = Thread-17 i = 0
Thread Name = Thread-18 i = 0
Thread Name = Thread-16 i = 1
Thread Name = Thread-17 i = 1
Thread Name = Thread-18 i = 1
Thread Name = Thread-17 i = 2
Thread Name = Thread-16 i = 2
Thread Name = Thread-17 i = 3
Thread Name = Thread-18 i = 2
Thread Name = Thread-18 i = 3
Thread Name = Thread-18 i = 4
Thread Name = Thread-17 i = 4
Thread Name = Thread-16 i = 3
Thread Name = Thread-16 i = 4

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

66 - 请解释什么是信号量,以及如何使用信号量

文章来源: ruochen.blog.csdn.net,作者:若尘,版权归原作者所有,如需转载,请联系作者。

原文链接:ruochen.blog.csdn.net/article/details/104851649

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。