假设我有一个用随机值初始化列表的程序。然后,应用程序生成一堆线程,每个线程都会从这个共享列表中弹出项目。我的问题是,这个操作线程是否安全:
try:
while global_list.pop():
...do something ..
except:
print ("list is empty")
是否会因为线程之间的竞争条件导致数据丢失
编辑:我已经提到了链接Are lists thread-safe,但是在引用的问题中对列表数据进行了操作,我只是在谈论从列表中弹出正在修改列表而不是其中的数据的项目。在我的代码片段中,做某事并不表示对列表数据的操作,它只是一些与列表数据无关的处理。
答案 0 :(得分:0)
我的答案是是 - 要获取多个线程一次使用的全局列表的元素输出(弹出),是线程安全的 < / em>的
原因是因为它是原子操作。
一次一个操作是原子操作。
选中link。
从上方链接
作用于共享内存的操作如果在a中完成则是原子操作 相对于其他线程的单步。当一个原子商店是 在共享变量上执行,没有其他线程可以观察到 修改半完成。当对a执行原子加载时 共享变量,它读取单个出现的整个值 这一刻。非原子载荷和商店不会产生这些 保证。
列表上的任何操作都不会成为原子操作,因此需要特别注意使用锁定,事件,条件或信号量等使其线程安全。 这在Are lists thread-safe这里解释。