为什么一根线会睡着?

2024-05-20 13:16:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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赋给计数器。减量运算也会出现类似的问题。你知道吗


Tags: 代码httpnewwww计数器线程threadstart
1条回答
网友
1楼 · 发布于 2024-05-20 13:16:59

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

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

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

如果您想了解更多关于在线程中应该做什么和不应该做什么,那么您应该查找的关键字是thread safe。你知道吗

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

相关问题 更多 >