作者james999 (无伤大雅)
看板C_Sharp
标题[问题] Event里若有共用变数,需要lock吗?
时间Thu Apr 12 15:07:19 2018
想请问一下,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://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1523516841.A.246.html
1F:→ ssccg: 要看有没有race condition 04/12 15:11
可能会有吧?
同样的物件建立了好几个,大家都用同样的callback function,
其中_handlers为共用的全域变数,是有可能同时存取到的,
例如:同时有物件触发Closed事件的话…
抱歉,EventHandler使用次数不多,不太确定我的理解是否有误?
还是说…EventHandler是会排队被执行的呢? 谢谢。
※ 编辑: james999 (220.132.128.217), 04/12/2018 15:28:16
2F:→ ssccg: 不一定,像如果没"存"都只有"取"就不会有 04/12 17:29
3F:→ ssccg: handler要看是会在哪个thread上触发,只有一个thread就会是 04/12 18:03
4F:→ ssccg: 依序执行 04/12 18:03
谢谢s大解说,明显我的案例就是会取(做删除的动作),
那麽我在看看这个dll内是否为一条thread哦!
主要是想到…原作者提供的范例就是这麽做的,
既然他没有加上lock,就会觉得应该不用加,
只是不加的理由我并不晓得原因XD
现在搞清楚了,谢谢哦:)
※ 编辑: james999 (220.132.128.217), 04/12/2018 18:41:18