多執行緒程式謹慎給 DB 加鎖

2021-08-02 04:45:06 字數 458 閱讀 6545

servera 起 n 個執行緒,每個執行緒執行相同的邏輯,就是去 db 取乙個待執行的任務來執行,也就是常見的任務佇列。具體邏輯是:

由於程式存在 bug, 但是執行緒會異常退出,異常退出時和 db 之間的連線並沒有關閉(潛意識裡認為執行緒退出連線會自動關閉,進而鎖會被釋放),而異常恰好出現在 lock tablea 和 unlock tablea 之前,這樣就會導致表一直被鎖。

需要明確是,檔案描述符是程序級資源(父子程序情況除外),只要程序不退出,即使建立 fd 的執行緒退出,該 fd 也不會自動關閉。也就是說,乙個 fd 是所有執行緒通用的,threada 建立的 fda, threadb 可以直接引用;同樣的,threada 退出時,fda 也不會被自動關閉,儘管 fda 是 threada 建立的。

因此,多執行緒程式對 db 加鎖是非常危險的,如果萬不得已加了鎖就一定要保證所有導致執行緒退出的異常邏輯都要關閉連線,以及不要通過執行緒退出來隱式關閉連線。

多執行緒程式何時需要加鎖

簡單的說三條 多人讀,不需要 一讀一寫要加 多人寫要加 常見錯誤 1讀1寫沒事,讀寫的記憶體約多,越容易出事,因為不是原子操作 對int int64 char型是原子操作,可不加鎖,其實沒人保證這一點的,要不c 1x還出個原子模板類幹什麼 常用例項 vector的操作是安全的,如乙個執行緒裡 buf...

多執行緒加鎖計數方法

import threading import time number 0def plus global number global宣告此處的number是外面的全域性變數number for in range 1000000 進行乙個大數級別的迴圈加一運算 number 1print 子執行緒 s...

Python多執行緒程式設計之多執行緒加鎖

python語言本身是支援多執行緒的,不像php語言。下面的例子是多個執行緒做同一批任務,任務總是有task num個,每次執行緒做乙個任務 print 做完後繼續取任務,直到所有任務完成為止。1 coding utf 8 2import threading 34 start task 0 5 ta...