【问题标题】:Why would a thread go to sleep?为什么线程会休眠?
【发布时间】:2015-10-09 04:40:17
【问题描述】:

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

【问题讨论】:

    标签: python multithreading operating-system


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 2017-12-28
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多