2015-07-20 74 views
2

我学习Python的线程与http://www.python-course.eu/threads.php 这段代码的解释帮助处理确实让我困惑:线程为什么会进入睡眠状态?

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分配给计数器。减量操作会发生类似的问题。

回答

2

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

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

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

如果你想了解更多关于你应该做什么和不应该做什么的话题,你应该找的关键字是thread safe

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

+0

Thks!然后出现线程安全的话题。 –

相关问题