zoukankan      html  css  js  c++  java
  • Are C# delegates threadsafe?

    http://stackoverflow.com/questions/6349125/are-c-sharp-delegates-thread-safe

    Regarding the invocation of the delegate the answer is yes.

    Invoking a delegate is thread-safe because delegates are immutable. However, you must make sure that a delegate exists first. This check may require some synchronization mechanisms depending on the level of safety desired.

    For example, the following could throw a NullReferenceException if SomeDelegate were set to null by another thread between the null check and the invocation.

    if(SomeDelegate!=null){SomeDelegate();}

    The following is a little more safe. Here we are exploiting the fact that delegates are immutable. Even if another thread modifies SomeDelegate the code is harded to prevent that peskyNullReferenceException.

    Action local =SomeDelegate;if(local !=null){
      local();}

    However, this might result in the delegate never being executed if SomeDelegate was assigned a non-null value in another thread. This has to do with a subtle memory barrier problem. The following is the safest method.

    Action local =Interlocked.CompareExchange(refSomeDelegate,null,null);if(local !=null){
      local();}

    Regarding the execution of the method referenced by the delegate the answer is no.

    You will have to provide your own thread-safety guarentees via the use of synchronization mechanisms. This is because the CLR does not automatically provide thread-safety guarentees for the execution of delegates. It might be the case that the method does not require any further synchronization to make it safe especially if it never access shared state. However, if the method reads or writes from a shared variable then you will have to consider how to guard against concurrent access from multiple threads.

  • 相关阅读:
    linux系统swap分区容量扩展
    linux系统lv_root分区容量扩展
    linux系统创建新LV,挂载新分区。
    linux 服务器重启后lvm 变成inactive状态解决
    Linux下使用fdisk扩大分区容量
    go语言 调用飞书群消息机器人接口
    SpringCloud Sentinel 学习笔记
    Git 笔记整理
    SpringBoot 整合 RabbitMQ 学习笔记
    js递归生成树形结构-vue
  • 原文地址:https://www.cnblogs.com/anorthwolf/p/3124281.html
Copyright © 2011-2022 走看看