为什么线程会休眠?

Why would a thread go to sleep?

我在 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_thread

的值

一个新的int实例将增加或减少1(我认为将创建一个新的int对象)

将新值分配给 num_threads

递增赋值时会出现这样的错误:

第一个线程读取变量 num_threads,它的值仍然是 0。 令人困惑的地方来了: 读取这个值后,线程被操作系统置于休眠状态。现在轮到第二个线程了:它还读取变量 num_threads 的值,它仍然是 0,因为第一个线程太早进入睡眠状态,即在它能够增加其值之前通过 1. 现在第二个线程进入休眠状态。现在轮到第三个线程了,它再次读取 0,但此时计数器应该是 2。这些线程中的每一个现在都将值 1 分配给计数器。递减操作也会出现类似的问题。

这里的线索是线程在概念上是并发的(它们 运行 彼此分开)但实际上是顺序的。 CPU 的每个核心一次只能执行一项操作,因此为了给您计算机是多任务处理的印象,CPU 以非常高的速度切换它正在做的事情。这通常是您的操作系统为您处理的。

因为 num_threads += 1 实际上是两个语句,即 temp_num = num_threads + 1num_threads = temp_num,所以 CPU 的线程可能会在这两个操作之间切换。

这说明了在多个线程之间访问共享数据的一些危险。

如果您想了解更多关于在线程中应该做什么和不应该做什么,您应该寻找的关键字是 thread safe

需要注意的是,如果线程是真正并发的,情况不会有太大改善,因为您仍然可能在错误的时间(甚至在写入时)从共享内存中读取数据.