为什么线程会休眠?
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 + 1
和 num_threads = temp_num
,所以 CPU 的线程可能会在这两个操作之间切换。
这说明了在多个线程之间访问共享数据的一些危险。
如果您想了解更多关于在线程中应该做什么和不应该做什么,您应该寻找的关键字是 thread safe
。
需要注意的是,如果线程是真正并发的,情况不会有太大改善,因为您仍然可能在错误的时间(甚至在写入时)从共享内存中读取数据.
我在 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 + 1
和 num_threads = temp_num
,所以 CPU 的线程可能会在这两个操作之间切换。
这说明了在多个线程之间访问共享数据的一些危险。
如果您想了解更多关于在线程中应该做什么和不应该做什么,您应该寻找的关键字是 thread safe
。
需要注意的是,如果线程是真正并发的,情况不会有太大改善,因为您仍然可能在错误的时间(甚至在写入时)从共享内存中读取数据.