![](/img/trans.png)
[英]Difference in starting threading.Thread objects from a list in python3
[英]Using lock in sub class of threading.Thread in python3
我想問一個關於以下代碼的問題:假設我們想要構建一個threading.Thread
子類ThreadCounter
,這樣它就有一個名稱、一個初始值和一個終端值作為參數,並且一旦啟動它就會遞增初始值直到它等於終端一。
import threading
from threading import Thread
import time
lock = threading.Lock()
class ThreadCounter(Thread):
def __init__(self, nome, first, limit, lock):
# Call the Thread class's init function
Thread.__init__(self)
self.nome = nome
self.first = first
self.limit = limit
self.lock = lock
# Override the run() function of Thread class
def run(self):
while self.first < self.limit:
self.lock.acquire()
self.first += 1
print(self.nome,self.first)
time.sleep(3)
self.lock.release()
t1 = ThreadCounter('Thread-1', 1, 5, lock)
t2 = ThreadCounter('Thread-2', 2, 10, lock)
t1.start()
t2.start()
t1.join()
t2.join()
我不明白當我們在兩個類中使用鎖時會發生什么。 特別是,我們是否將相同的鎖定對象分配給具有分配的兩個實例
t1 = ThreadCounter('Thread-1', 1, 5, lock)
t2 = ThreadCounter('Thread-2', 2, 10, lock)
或者我們對於線程計數器 class 的每次出現都有一個不同的鎖 object,這樣 t1 和 t2 不共享同一個鎖?
是同一個鎖。 如果每個線程都有自己的鎖,它會破壞鎖定的目的。
鎖的目的是使兩個線程同步,以確保它們不會同時執行關鍵部分。 在這種情況下,它唯一有效鎖定的是print
,但如果兩個線程正在操作像列表這樣的共享資源,則鎖定將確保一次只有一個線程接觸列表。 這是必需的,因為大多數對象不能安全地同時在跨線程上操作(“非線程安全”)。
查看“同步原語”以了解不同的同步選項是什么,以及為什么它們是必要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.