我在http://www.python-course.eu/threads.php的帮助下学习python线程处理 对这段代码的解释让我很困惑:
from thread import start_new_thread
num_threads = 0
def heron(a):
global num_threads
num_threads += 1
# code has been left out, see above(some operations)
num_threads -= 1
return new
start_new_thread(heron,(99,))
start_new_thread(heron,(999,))
start_new_thread(heron,(1733,))
start_new_thread(heron,(17334,))
while num_threads > 0:
pass
代码:
num_threads += 1
读取num\u线程的值
一个新的int实例将递增或递减1(我认为将创建一个新的int对象)
将新值赋给num\u线程
在增量分配的情况下会发生这样的错误:
第一个线程读取变量num\u threads,该变量的值仍然为0。 令人困惑的是:读取此值后,操作系统将线程置于休眠状态。现在轮到第二个线程了:它还读取变量num\u threads的值,该值仍然是0,因为第一个线程过早进入睡眠状态,即在它能够将其值增加1之前。现在第二个线程被休眠。现在轮到第三个线程了,它再次读取0,但此时计数器应该是2。现在,每个线程都将值1赋给计数器。减量运算也会出现类似的问题。你知道吗
这里的线索是线程在概念上是并发的(它们彼此并行运行),但实际上是连续的。CPU的每个核心一次只能执行一个操作,因此,为了给你一种计算机是多任务的印象,CPU以非常高的速度切换它正在执行的操作。通常是您的操作系统为您处理这些问题。你知道吗
因为
num_threads += 1
实际上是两个语句,即temp_num = num_threads + 1
和num_threads = temp_num
,所以您的CPU正在执行的线程可能会在这两个操作之间切换。你知道吗这说明了在多个线程之间访问共享数据的一些危险。你知道吗
如果您想了解更多关于在线程中应该做什么和不应该做什么,那么您应该查找的关键字是
thread safe
。你知道吗应该注意的是,如果线程真的是并发的,情况不会有多大改善,因为您仍然可能在错误的时间(甚至在写入共享内存时)读取它。
相关问题 更多 >
编程相关推荐