簡體   English   中英

在python3中threading.Thread的子class中使用鎖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM