[問題] Event裡若有共用變數,需要lock嗎?

看板C_Sharp (C#)作者 (無傷大雅)時間7年前 (2018/04/12 15:07), 7年前編輯推噓0(004)
留言4則, 1人參與, 7年前最新討論串1/1
想請問一下,Event觸發的Function內, 若是會存取共用變數,需要弄個lock嗎? 認知上,許多物件都會呼叫這個callback function, 所以理論上應該要加? 謝謝。 -- webSocketHandler.TextMessageReceived += ((sendor, msg) => { BroadcastMessage(ClientName, msg); }); webSocketHandler.Closed += (sendor, arg) => { BroadcastMessage(ClientName, ClientName + " Disconnected!"); _handlers.Remove(ClientName); }; webSocketHandler.Opened += (sendor, arg) => { BroadcastMessage(ClientName, ClientName + " Connected!"); }; -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.128.217 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1523516841.A.246.html

04/12 15:11, 7年前 , 1F
要看有沒有race condition
04/12 15:11, 1F
可能會有吧? 同樣的物件建立了好幾個,大家都用同樣的callback function, 其中_handlers為共用的全域變數,是有可能同時存取到的, 例如:同時有物件觸發Closed事件的話… 抱歉,EventHandler使用次數不多,不太確定我的理解是否有誤? 還是說…EventHandler是會排隊被執行的呢? 謝謝。 ※ 編輯: james999 (220.132.128.217), 04/12/2018 15:28:16

04/12 17:29, 7年前 , 2F
不一定,像如果沒"存"都只有"取"就不會有
04/12 17:29, 2F

04/12 18:03, 7年前 , 3F
handler要看是會在哪個thread上觸發,只有一個thread就會是
04/12 18:03, 3F

04/12 18:03, 7年前 , 4F
依序執行
04/12 18:03, 4F
謝謝s大解說,明顯我的案例就是會取(做刪除的動作), 那麼我在看看這個dll內是否為一條thread哦! 主要是想到…原作者提供的範例就是這麼做的, 既然他沒有加上lock,就會覺得應該不用加, 只是不加的理由我並不曉得原因XD 現在搞清楚了,謝謝哦:) ※ 編輯: james999 (220.132.128.217), 04/12/2018 18:41:18
文章代碼(AID): #1QpmMf96 (C_Sharp)
文章代碼(AID): #1QpmMf96 (C_Sharp)