31 多线程同步之Lock(互斥锁)
如果多个线程共同对某个数据修改,则可能出现不可预测的结果,这个时候就需要使用互斥锁来进行同步。例如,在三个线程对共同变量num进行100万次加减操作之后,其num的结果不为0.
【示例 1】不加锁的意外情况
运行结果如下:
-19
每次执行的结果是随机的,为0的概率非常小,之所以会出现不为0的情况,是因为这里同时又许多 语句修改num的值,当一个线程正在执行num+n,另外一个线程正在执行num-n , 从而导致之前的线程执行num-n 时num的值已不是之前的值,因此最终结果不为0. 为了保证数据的准确性,需要使用互斥锁对多个线程进行同步,限制当一个线程正在访问数据时,其他只能等待,知道前一线释放锁。使用threading.Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些每次只允许一个线程操作的数据,可以将其操作放到acquire方法和release方法之间。
【示例 2】加互斥锁后运行结果始终一致
无论运行多少次,执行结果都为0
还没有评论,来说两句吧...