📅  最后修改于: 2023-12-03 15:06:57.542000             🧑  作者: Mango
在多线程编程中,可能需要让多个线程等待某个条件满足后同时执行。这个时候可以使用注释休眠的方法实现多对多的等待/唤醒操作。
本示例中包含一个共享计数器Counter,初始值为0,存在4个线程,其中2个线程会对计数器进行加一操作,另外2个线程会进行减一操作。当计数器的值达到10时,所有线程将被唤醒并执行结束。
import threading
class Counter:
def __init__(self):
self.value = 0
self.cond = threading.Condition()
def inc(self):
with self.cond:
self.value += 1
print(f"Inc: {self.value}")
if self.value == 10:
self.cond.notify_all()
def dec(self):
with self.cond:
self.value -= 1
print(f"Dec: {self.value}")
if self.value == 10:
self.cond.notify_all()
def inc_thread(counter):
for i in range(10):
counter.inc()
threading.currentThread().sleep(0.1)
def dec_thread(counter):
for i in range(10):
counter.dec()
threading.currentThread().sleep(0.1)
if __name__ == "__main__":
counter = Counter()
incthreads = [threading.Thread(target=inc_thread, args=(counter,)) for _ in range(2)]
decthreads = [threading.Thread(target=dec_thread, args=(counter,)) for _ in range(2)]
for t in incthreads + decthreads:
t.start()
for t in incthreads + decthreads:
t.join()
首先定义了一个计数器Counter,其中维护着一个int类型的值和一个Condition对象,Condition对象用来进行线程同步。
计数器有两个方法inc和dec,分别对计数器的值进行加一和减一操作。
在inc和dec方法中通过with self.cond:
获取Condition对象的控制权,然后将计数器的值加一或减一,并判断计数器的值是否等于10,如果等于10,就通过self.cond.notify_all()
唤醒所有等待Condition对象的线程。
在两个线程函数inc_thread
和dec_thread
中,循环10次进行计数器的操作,并使用sleep(0.1)
模拟计数器的变化速度。
最后在主函数中创建多个inc_thread和dec_thread线程并启动,等待线程依次执行完毕。当计数器的值达到10时,所有线程被唤醒并一起结束。
使用注释休眠的方法能够实现多对多的等待/唤醒操作,并且能够避免线程进入无限等待状态。在实际开发中,需要根据具体应用场景,合理选择线程同步机制,并进行适当的调优,才能保证程序的正确性和性能。