def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):
"""This constructor should always be called with keyword arguments. Arguments are:
*group* should be None; reserved for future extension when a ThreadGroup
class is implemented.
*target* is the callable object to be invoked by the run()
method. Defaults to None, meaning nothing is called.
*name* is the thread name. By default, a unique name is constructed of
the form "Thread-N" where N is a small decimal number.
*args* is the argument tuple for the target invocation. Defaults to ().
*kwargs* is a dictionary of keyword arguments for the target
invocation. Defaults to {}.
If a subclass overrides the constructor, it must make sure to invoke
the base class constructor (Thread.__init__()) before doing anything
else to the thread.
import threading
import time
balance = 0
lock = threading.Lock()
def change_it(name1,n):
global balance
balance = balance + n
balance = balance - n
print("%d %s: %d " % (n ,name1, balance))
def print_time(delay,name1):
while(1):
for i in range(100000):
time.sleep(0.1)
lock.acquire()
try:
change_it(name1,i)
finally :
lock.release()
try:
t = threading.Thread(target=print_time,args=(1,"LoopThread"))
t2 = threading.Thread(target=print_time,args=(1,"Loopxxad2"))
t3 = threading.Thread(target=print_time,args=(2,"Loopx3333"))
t.start()
t2.start()
t3.start()
t.join()
t2.join()
t3.join()
except:
print("Error: unable to start thread")
while (1):
pass
本文通过Python示例代码,详细介绍了多线程环境下如何使用锁(lock)来确保数据的一致性和线程的安全调用。通过定义全局变量并利用锁进行保护,演示了在多个线程中并发调用同一函数时,如何避免数据竞争和死锁问题。
2641

被折叠的 条评论
为什么被折叠?



