關(guān)于線程安全性的文檔說明 windows自帶的消息隊(duì)列是線程安全的么?
windows自帶的消息隊(duì)列是線程安全的么?在windows中,線程只有一個(gè)消息隊(duì)列(PostMessage message queue)。非模態(tài)對話框的消息在主線程的消息循環(huán)中處理。對于模態(tài)對話框,
windows自帶的消息隊(duì)列是線程安全的么?
在windows中,線程只有一個(gè)消息隊(duì)列(PostMessage message queue)。非模態(tài)對話框的消息在主線程的消息循環(huán)中處理。對于模態(tài)對話框,它首先禁止主窗口,然后建立一個(gè)消息循環(huán)來處理消息。對話框完成后,將停止其消息循環(huán),然后啟用主窗口。因此,在一個(gè)線程中只有一個(gè)消息隊(duì)列(PostMessage message queue),但是在主線程的消息循環(huán)之外可能還有其他的
安全!消息隊(duì)列是消息的鏈表,存儲(chǔ)在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)記。
linux消息隊(duì)列線程安全嗎?
有很多方法可以使用它。
如果通話頻率不高,我會(huì)做定量分析程序。通常,我使用C來啟用python進(jìn)程。pypy的速度更快。Pypy將結(jié)果生成到redis或mysql的內(nèi)存表中。調(diào)用后,C轉(zhuǎn)到redis或mysql的內(nèi)存表,也可以用文件寫入來完成,但文件寫入很容易出現(xiàn)不同步,不想用網(wǎng)絡(luò)版,可以用SQLite來寫結(jié)果,然后用SQLite在另一個(gè)程序中讀取。如果它類似于Internet服務(wù),則可以使用消息隊(duì)列和消息服務(wù)器進(jìn)行通信。如果您的程序需要線程安全和關(guān)鍵區(qū)域保護(hù),最好使用消息隊(duì)列來支持多線程和多進(jìn)程同時(shí)訪問。消息隊(duì)列比數(shù)據(jù)庫存儲(chǔ)速度快,但不便于數(shù)據(jù)庫存儲(chǔ)。
vedis的原生版本有C版本,高仿redis的嵌入式版本。您可以使用這個(gè)初始開發(fā)。如果您需要切換到redis,您可以輕松地將vedis修改為redis。SSDB可以在地面存儲(chǔ)redis。SSDB是高仿redis的存儲(chǔ)版本。
如果沒有數(shù)據(jù)存儲(chǔ),可以使用套接字通信或多進(jìn)程通信。例如,chrome是多進(jìn)程的,命名管道用于通信。理論上,這可以用于多語言之間的調(diào)用。命名管道比消息隊(duì)列快,但需要自定義。調(diào)用方法的協(xié)議可以用JSON來完成,因此一般可以使用n種多語言。如果我們追求性能,我們可以使用二進(jìn)制通信協(xié)議。
Python調(diào)用C語言的方法也很成熟,但需要編寫一些代碼打包,需要防止內(nèi)存泄漏、多線程同步、阻塞、異常等問題。
C 多線程消息隊(duì)列?
當(dāng)隊(duì)列已滿時(shí),請輸入隊(duì)列。當(dāng)隊(duì)列為空時(shí),退出隊(duì)列。因此,當(dāng)一個(gè)線程正在將一個(gè)完全阻塞的隊(duì)列排隊(duì)時(shí),它將阻塞,除非另一個(gè)線程正在排隊(duì)。當(dāng)一個(gè)線程將一個(gè)空的阻塞隊(duì)列排隊(duì)時(shí),它將阻塞,除非另一個(gè)線程正在排隊(duì)。從上面可以看出,阻塞隊(duì)列是線程安全的。
blockingqueue線程安全嗎?
有兩種選擇。
Scheme 1 Local message transaction table
生產(chǎn)者需要添加一個(gè)事務(wù)消息表。具體步驟如下:[1。生產(chǎn)者執(zhí)行業(yè)務(wù)邏輯并將事務(wù)記錄插入到消息表中。這兩個(gè)操作在一個(gè)本地事務(wù)中
2。啟動(dòng)后臺(tái)線程定期輪詢消息表并將消息發(fā)送到消息隊(duì)列
3。刪除消息表中的消息,直到發(fā)送成功。
方案2需要消息隊(duì)列支持,業(yè)務(wù)端提供回溯接口
1。生產(chǎn)端將準(zhǔn)備好的消息發(fā)送到消息隊(duì)列
2。在本地事務(wù)中,業(yè)務(wù)邏輯
3。根據(jù)執(zhí)行結(jié)果確認(rèn)或取消準(zhǔn)備好的消息
4。消息隊(duì)列將確保準(zhǔn)備好的消息被確認(rèn)或取消,并且消息隊(duì)列將不斷地向生產(chǎn)端請求執(zhí)行結(jié)果,這要求生產(chǎn)端提供類似的回調(diào)函數(shù)。
在方案2中,消息隊(duì)列取代了方案1中的消息表和后臺(tái)線程輪詢功能,但并非所有消息隊(duì)列都支持此功能。支持Rocketmq。
方案1的開發(fā)工作量大,外部依賴性小
方案2的開發(fā)工作量小,但依賴于特定的消息隊(duì)列。