31 多线程同步之Lock(互斥锁)

今天药忘吃喽~ 2022-09-04 04:50 351阅读 0赞

如果多个线程共同对某个数据修改,则可能出现不可预测的结果,这个时候就需要使用互斥锁来进行同步。例如,在三个线程对共同变量num进行100万次加减操作之后,其num的结果不为0.

【示例 1】不加锁的意外情况

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NqMzQ5NzgxNDc4_size_16_color_FFFFFF_t_70

运行结果如下:

-19

每次执行的结果是随机的,为0的概率非常小,之所以会出现不为0的情况,是因为这里同时又许多 语句修改num的值,当一个线程正在执行num+n,另外一个线程正在执行num-n , 从而导致之前的线程执行num-n 时num的值已不是之前的值,因此最终结果不为0. 为了保证数据的准确性,需要使用互斥锁对多个线程进行同步,限制当一个线程正在访问数据时,其他只能等待,知道前一线释放锁。使用threading.Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些每次只允许一个线程操作的数据,可以将其操作放到acquire方法和release方法之间。

【示例 2】加互斥锁后运行结果始终一致

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NqMzQ5NzgxNDc4_size_16_color_FFFFFF_t_70 1

无论运行多少次,执行结果都为0

20210811112815308.png

发表评论

表情:
评论列表 (有 0 条评论,351人围观)

还没有评论,来说两句吧...

相关阅读

    相关 linux线互斥

    基本概念: 互斥变量是用pthread\_mutex\_t数据类型表示的。在使用互斥变量以前,必须首先对它进行初始化,可以把它设置为常量PTHREAD\_MUTEX

    相关 linux线同步互斥

    互斥锁(互斥量)是线程用来同步彼此行为的工具。互斥锁可以帮助线程同步对共享资源的使用,以防如下情况发生:线程某甲试图访问一共享变量时,线程某乙正在对其修改。 未避免线程更新共