我遇到过一些程序,其中使用了互斥锁沿着线程连接。
多个线程正在编辑同一个变量(本例中为list)。每个线程都调用另一个线程,所以它是一种父子关系。必须使用线程连接来确保同步。
当一个线程连接确保除非被调用的子线程完成,否则调用的父线程不能执行时,是否有为列表变量添加互斥量获取/释放的用例?
下面的程序递归地搜索任何指定目录中名为'json'的文件
import os
from os.path import isdir, join
from threading import Thread, Lock
mutex = Lock()
search_result = []
def search_files(root, searchfile):
search_threads = []
for file in os.listdir(root):
fullpath = join(root,file)
if searchfile in fullpath:
mutex.acquire()
search_result.append(fullpath)
mutex.release()
if isdir(fullpath):
t = Thread(target=search_files, args=([fullpath, searchfile]))
t.start()
search_threads.append(t)
for t in search_threads:
t.join()
root_path = '/users/kn/'
searchfile = 'json'
t = Thread(target=search_files, args=([root_path, searchfile]))
t.start()
t.join()
print(f' Num files with name {searchfile} = {len(search_result)}')
无论我是否使用互斥体,我都得到相同的结果。
尝试理解这个例子中互斥沿着连接的用法。
1条答案
按热度按时间xxslljrj1#
互斥(mutex,“mutual exclusion”的缩写)用于确保一个共享资源或变量一次只能被一个线程访问,从而防止竞争条件。
在给定的代码中,“search_result”列表是一个共享资源,可以由多个线程访问和修改。
join()方法将确保父线程在父线程继续之前等待其子线程完成执行。它有助于同步线程的执行顺序,但不能防止并发访问共享资源。这是危险的,因为它可能导致异常行为,甚至数据损坏。
“search_files”函数可以被多个线程并发调用,因为它被用作所有新线程的目标。因此,这些线程中的每一个都可能找到匹配的文件并将其附加到“search_result”列表。
顺便说一下,你说你得到的结果是相同的,无论你是否使用互斥。这可能是因为您正在测试的目录结构和测试用例中涉及的线程数量可能不够大,不足以触发争用条件。
请记住:在多线程程序中处理共享资源时使用互斥体仍然是一个很好的实践,可以避免在更复杂的场景中出现潜在的问题!