多執行緒開發中遇到的問題

2021-07-28 21:07:54 字數 1164 閱讀 1506

1.開發專案:

大體框架如下:  

1. 主線程接收命令, 放進佇列 1 中. (命令分 2 種: 本地執行命令;   網路傳輸命令)

2. 處理執行緒: 從佇列 1 中取出依次取出命令進行處理;

分兩種情況: 1. 取到本地命令, 直接執行, 並立即將結果放入佇列 2 中, 使用訊號量 通知主線程 接收處理結果;

2. 網路傳輸命令, 本地立即組包, 成功後放入佇列 3 中, 使用訊號量通知 傳送執行緒去傳送資料;

3. 傳送執行緒: 接收到訊號量通知後, 獲取佇列 3 將出隊的元素, 傳送至指定的 伺服器位址, 注意: 佇列中此時 傳送的該元素不會被刪除; 並將該元素的值 與 傳送時間寫入鍊錶 1 中;

4. 接收執行緒: 一直阻塞在接收, 接收到資訊後, 馬上將資訊進行解包, 判斷資料報正確與否以及是否為伺服器應答或推送, 若為應答: 刪除 執行緒3(傳送執行緒)中 佇列3剛傳送的元素,

以及鍊錶1 中對應的元素, 並將解包後的資料放入 佇列 2 中, 使用訊號量通知主線程 接收處理結果;

5. 時間執行緒: 每隔 5s, 對鍊錶進行遍歷, 看鍊錶  1 中是否有元素存在, 並判斷該元素是否 接收超時. 如超時, 傳送訊號量通知傳送執行緒重新傳送.

在該框架處理過程中, 遇到 的問題:

1.客戶端向 伺服器傳送資料過程中, (如1000張), 傳送至一半, 伺服器會出現解析資料報錯誤; 

查詢問題思路: 1.1 在處理執行緒組完資料報後, 對該資料報進行判斷, 是否正確;  

1.2 傳送執行緒中, 傳送資料前, 再對資料報進行判斷, 是否正確;  (發現此時 有的資料報會出錯 )

1.3 接收執行緒中, 接收應答成功後, 準備刪除 資料前, 再對將刪除的資料報進行判斷, 是否正確;

1.4 將伺服器接收的包進行解析, 檢視其中的內容, 與上述幾個過程中的 解析資料進行對比.

解決思路: 1.是否為訊號量在 幾個執行緒間不同步造成的; (發現不是, 一直以為是此處的問題, 浪費了老長時間) 

2. 看是否為多執行緒的 共享資源被汙染; 上述使用的 佇列,鍊錶,都為全域性共享資源, 果然是此處問題, 佇列中儲存的 記憶體塊位址被 執行緒2 與 執行緒4 互相爭搶,造成汙染;

資料被修改, 導致伺服器接收的資料不正確, 崩潰...

爬坑的深刻體會:  多執行緒, 共享資源一定, 一定, 一定 要加鎖... 即使有其他的同步手段, 加鎖也更保險.

with語句在多執行緒程式設計中遇到的問題

段1 1 coding utf 8 2from threading import thread,boundedsemaphore 3from datetime import datetime 4import time56 定義乙個函式 7def showtime signal 8print date...

WPF開發中的多執行緒的問題

今天幫助同事做了乙個wpf版的多執行緒demo,分享給大家。要實現的問題就是非主線程thread1 去後台不停的取新資料,當有新資料的時候就會展示到前台。我給他做的demo實現乙個按秒的計數器,隨著時間然後每秒資料加1,這個demo涉及到的點有 多執行緒,垮執行緒更改控制項的值dispatcher的...

開發中遇到的問題

最後再一次單步除錯中發現 nsurl urlwithstring 返回的nsurl居然為nil。大概找到問題所在了,在網上查了如何解決獲取空的nsurl,大致方法如下 原因 nsurl urlwithstring 這個方法要求傳乙個字串型別的引數,引數如果有中文的話,得到的物件就是空。解決辦法 先把...