Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多线程和不一致的输出_Python_Multithreading_Concurrency - Fatal编程技术网

Python多线程和不一致的输出

Python多线程和不一致的输出,python,multithreading,concurrency,Python,Multithreading,Concurrency,多次运行此命令会产生不同的输出,有些是负数,有些是正数。是因为两个线程使用相同的全局x吗?我不明白为什么:尘埃落定后的净效应(输出)不应该是一样的吗?这是一个经典的比赛条件。对这种情况有很好的解释。这是一个经典的竞争条件。对这种情况有很好的解释。不一定。想象一下下面的事件序列。我们将在程序运行一段时间后的精确时刻开始;Thread1和Thread2都位于for循环的内,并且x=0 Thread1具有控制权。它访问x,以确定x+1的值x是0,因此结果是1。然而 在Thread1完成分配之前,控制传

多次运行此命令会产生不同的输出,有些是负数,有些是正数。是因为两个线程使用相同的全局x吗?我不明白为什么:尘埃落定后的净效应(输出)不应该是一样的吗?

这是一个经典的比赛条件。对这种情况有很好的解释。

这是一个经典的竞争条件。对这种情况有很好的解释。

不一定。想象一下下面的事件序列。我们将在程序运行一段时间后的精确时刻开始;
Thread1
Thread2
都位于
for
循环的
内,并且
x=0

  • Thread1
    具有控制权。它访问
    x
    ,以确定
    x+1
    的值
    x
    0
    ,因此结果是
    1
    。然而
  • Thread1
    完成分配之前,控制传递到
    Thread2
    x
    仍然是
    0
  • Thread2
    现在可以访问
    x
    。它计算
    x-1
    ,这是
    -1
    ,因为
    x
    仍然是
    0
    。由于线程计时的不可预测性,它成功地完成了操作,将
    -1
    分配给
    x
  • 控件现在返回到
    Thread1
    。它已经将
    x+1
    的值计算为
    1
    。它将
    1
    分配给
    x

  • 两个线程都完成了一次迭代,
    x
    的值应该是
    0
    ,但其实际值不一定是
    1

    。想象一下下面的事件序列。我们将在程序运行一段时间后的精确时刻开始;
    Thread1
    Thread2
    都位于
    for
    循环的
    内,并且
    x=0

  • Thread1
    具有控制权。它访问
    x
    ,以确定
    x+1
    的值
    x
    0
    ,因此结果是
    1
    。然而
  • Thread1
    完成分配之前,控制传递到
    Thread2
    x
    仍然是
    0
  • Thread2
    现在可以访问
    x
    。它计算
    x-1
    ,这是
    -1
    ,因为
    x
    仍然是
    0
    。由于线程计时的不可预测性,它成功地完成了操作,将
    -1
    分配给
    x
  • 控件现在返回到
    Thread1
    。它已经将
    x+1
    的值计算为
    1
    。它将
    1
    分配给
    x

  • 两个线程都完成了一次迭代,
    x
    的值应该是
    0
    ,但它的实际值是
    1

    这是多线程计算中的一个经典并发问题。每个线程必须从内存中读取x的当前值,修改它,然后写回。如果线程1读取该值,那么线程2将更新该值,当线程1写回该值时,它将取消线程2的更新。这就是为什么您应该始终使用适当的同步结构,如信号量等。

    这是多线程计算中的一个典型并发问题。每个线程必须从内存中读取x的当前值,修改它,然后写回。如果线程1读取该值,那么线程2将更新该值,当线程1写回该值时,它将取消线程2的更新。这就是为什么您应该始终使用适当的同步结构,如信号量等。

    您的操作不是原子的。你应该使用锁来获得正确的结果。你的操作不是原子的。您应该使用锁来获得正确的结果。
    import threading
    
    x = 0;
    
    class Thread1(threading.Thread):
        def run(self):
            global x
            for i in range(1,100000):
                x = x + 1
    
    class Thread2(threading.Thread):
        def run(self):
            global x
            for i in range(1,100000):
                x = x - 1
    
    #create two threads
    t1 = Thread1()
    t2 = Thread2()
    
    #start the threads
    t1.start()
    t2.start()
    
    #wait for the threads to finish
    t1.join()
    t2.join()
    
    print x;