线程及其互斥锁:

线程及其互斥锁:

线程共享全局变量,但是当多个线程对同一个变量进行操作时,会出现混乱,为了解决这个问题,我们可以用轮询以及互斥锁的方法,对多个线程实现同步控制。

互斥锁的工作原理:

当某个线程要改共享数据时,先将其锁定,此时资源状态为“锁定”,其他线程不能更改;直到该线程释放资源,互斥锁保证了每次只有一个线程进行读写操作,从而保证了多线程情况下数据的正确性。

注意:互斥锁在运用时,必须在每个线程中都上锁,这样多个线程才会抢着上锁。

死锁的解决办法:

设置超时时间:在加锁时设置一定的时间,如果时间到了,还不满足时间,则默认会不加锁执行。

在设计时利用银行家算法

创建互斥锁的步骤:

Mutex = threading.Lock() #创建锁对象

Mutdex.acquire(blocking)#锁定

Mutdex.release()#释放

方法一:轮询的方法

from threading import Thread

import time

num = 0

flag = False

 

def fun1():

    global num

    global flag

    if flag == False:

        for i in range(100000):

            num += 1

        flag = True

        print("fun1的结果:{}".format(num))

 

def fun2():

    global num

    while True:

        if flag == True:

            for i in range(100000):

                num += 1

            print('fun2的结果:%d' % num)

            break

 

thread1 = Thread(target=fun1)

thread2 = Thread(target=fun2)

thread1.start()

thread2.start()

方法二:互斥锁

from threading import Thread, Lock

import time

num = 0

lock = Lock()

def fun1():

    lock.acquire()

    global num

    for i in range(100000):

        num += 1

    print("fun1的结果:{}".format(num))

    lock.release()

 

def fun2():

    lock.acquire()

    global num

    for i in range(100000):

        num += 1

    print('fun2的结果:%d' % num)

    lock.release()

 

thread1 = Thread(target=fun1)

thread2 = Thread(target=fun2)

thread1.start()

thread2.start()

猜你喜欢

转载自blog.csdn.net/Zp18189530679/article/details/81261217
今日推荐