1. 多线程加锁
在多线程加锁的过程中,要注意如下两个核心关键点:
加锁的位置
,加锁的位置代表了一旦其中某一线程获取锁后,其他线程就会阻塞到此位置,当加锁的线程执行完毕释放锁后,其他线程会根据阻塞时的位置继续向向执行。加锁边界处理
, 在到达边界时,一旦某一线程完成任务后,其他阻塞的线程就不能继续完成任务,要考虑其他线程要退出任务。防止死锁
,正常情况下cpu执行一个锁要从加锁到释放锁这么一个原子性操作,若在加锁后还为解锁时,就退出任务,此时就变为死锁,自己和其他都一致会阻塞
举例说明:
import time
from threading import Thread,Lock,currentThread
import logging
FORMAT = "%(asctime)s %(threadName)s %(thread)d %(message)s"
# logging.basicConfig(format=FORMAT,level=logging.INFO)
logging.basicConfig(format=FORMAT,level=logging.INFO)
cups = []
lock = Lock()
def worker(count=10):
logging.info("I'am working for CPU.")
flag = False
while not flag:
#