为什么线程会进入睡眠状态?

时间:2015-07-20 06:29:06

标签: python multithreading operating-system

我在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分配给计数器。递减操作会出现类似的问题。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

应该注意的是,如果线程确实是并发的,那么情况就不会有太大改善,因为你仍然可以在错误的时间从共享内存中读取(或者甚至在它正在被读取时)写)。