C#线程同步

  1. lock 关键字可以用来确保代码块完成运行,提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。Lock关键字是使用Monitor类实现的使用 lock 关键字通常比直接使用 Monitor 类更可取,一方面是因为 lock 更简洁,另一方面是因为 lock 确保了即使受保护的代码引发异常,也可以释放基础监视器。这是通过 finally 关键字来实现的,无论是否引发异常它都执行关联的代码块。
  2. Monitor:与 lock 和 SyncLock 关键字类似,监视器防止多个线程同时执行代码块。Enter 方法允许一个且仅一个线程继续执行后面的语句;其他所有线程都将被阻止,直到执行语句的线程调用 Exit。这与使用 lock 关键字一样
  3. 同步事件:具有通知功能
    让线程等待非终止的同步事件可以将线程挂起,将事件状态更改为终止可以将线程激活。如果线程尝试等待已经终止的事件,则线程将继续执行,而不会延迟
    Set方法: 将事件置于终止状态,激活线程
    同步事件有两种:
    AutoResetEventManualResetEvent。它们之间唯一的不同在于,无论何时,只要 AutoResetEvent 激活线程,它的状态将自动从终止变为非终止。相反,ManualResetEvent 允许它的终止状态激活任意多个线程,只有当它的 Reset 方法被调用时才还原到非终止状态。
  4. Mutex对象(互斥量)
    与监视器不同的是,命名mutex 可以用来使跨进程的线程同步,且只能有拥有Mutex的线程释放
  5. InterLocked类
    为多个线程共享的变量提供原子操作。
  6. ReaderWriterLock类
    定义支持单个写线程和多个读线程的锁。
  7. Semaphore信号量
    使用一个计数器对共享资源进行访问控制,Semaphore构造函数需要提供初始化的计数器(信号量)大小以及最大的计数器大小。
    访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该信号量许可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请许可证的线程将会得到竞争得到被释放的许可证。
    初始化信号量大小 与当前线程调用了
    WaitOne(maximumCount 减去 initialCount)次相同。
    命名信号量系统级有效
原文地址:https://www.cnblogs.com/phenixyu/p/3967145.html