File tree 1 file changed +36
-0
lines changed
1 file changed +36
-0
lines changed Original file line number Diff line number Diff line change 84
84
|work |
85
85
------
86
86
87
+ 在主程序中,我们有以下步骤: ::
87
88
89
+ t1 = threading.Thread(target = increment_with_lock)
90
+ t2 = threading.Thread(target = decrement_with_lock)
91
+
92
+ 启动线程: ::
93
+
94
+ t1.start()
95
+ t2.start()
96
+
97
+ 然后阻塞主线程直到所有线程完成: ::
98
+
99
+ t1.join()
100
+ t2.join()
101
+
102
+ 在 ``increment_with_lock() `` 函数和 ``decrement_with_lock() `` 函数中,可以看到我们使用了lock语句。当你需要使用资源的时候,调用 ``acquire() `` 拿到锁(如果锁暂时不可用,会一直等待直到拿到),最后调用 ``release() ``: ::
103
+
104
+ shared_resource_lock.acquire()
105
+ shared_resource_with_lock -= 1
106
+ shared_resource_lock.release()
107
+
108
+ 让我们总结一下:
109
+
110
+ - 锁有两种状态: locked(被某一线程拿到)和unlocked(可用状态)
111
+ - 我们有两个方法来操作锁: ``acquire() `` 和 ``release() ``
112
+
113
+ 需要遵循以下规则:
114
+
115
+ - 如果状态是unlocked, 可以调用 ``acquire() `` 将状态改为locked
116
+ - 如果状态是locked, ``acquire() `` 会被block直到另一线程调用 ``release() `` 释放锁
117
+ - 如果状态是unlocked, 调用 ``release() `` 将导致 ``RuntimError `` 异常
118
+ - 如果状态是locked, 可以调用 ``release() `` 将状态改为unlocked
119
+
120
+ |more |
121
+ ------
122
+
123
+ 尽管理论上行得通,但是锁的策略不仅会导致有害的僵持局面。还会对应用程序的其他方面产生负面影响。这是一种保守的方法,经常会引起不必要的开销,也会限制程序的可扩展性和可读性。更重要的是,有时候需要对多进程共享的内存分配优先级,使用锁可能和这种优先级冲突。最后,从实践的经验来看,使用锁的应用将对debug带来不小的麻烦。所以,最好使用其他可选的方法确保同步读取共享内存,避免竞争条件。
You can’t perform that action at this time.
0 commit comments