线程同步的手段很多
lock 是通过内存索引块 0 1 切换 进行互斥的实现
互斥量 信号量 事件消息 其实意思就是 一个 标记量
通过这个标记 来进行类似的互斥手段
具体方式的分析 代码在后
1.互斥量 Mutex 作用 非常类似lock 一个Mutex 名称来代替 lock的引用对象
2.信号量 SemaphoreSlim 作用 同时访问同一个资源的线程数量 跨程序同步的场景下可以使用 混合模式
3.事件标识 AutoResetEvent 作用 类似lock 通过 waitone 阻塞与 set 通行 但只有一个线程可用标识
4.事件标识 ManualResetEventSlim 通过 set 通行 reset 设置阻塞 wait 阻塞 多个线程可用标识
5.事件标识 CountdownEvent 作用 限制指定次数信号量 达到后通行
6. SpinWait 自选锁 混合模式
7. ReaderWriterLockSlim 读写锁
互斥量 Mutex ReleaseMutex 测试先在项目路径cmd用命令行dotnet run 执行 然后在看断点
class Program
{
static void Main(string[] args)
{
const string MutexName = "testMutex";
using (var m = new Mutex(false, MutexName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(3), false))
{
Console.WriteLine("未捕获到互斥量");
}
else
{
Console.WriteLine("执行逻辑");
Console.ReadLine();
//释放互斥量
m.ReleaseMutex();
}
}
}
}

信号量 SemaphoreSlim 设置数量为4 循环中执行3次 主线程执行一次 发现主线程没执行
必须释放信号量 才可以 满足 最大执行数保存在4以内
class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 3; i++)
{
string threadName = "Thread " + i;
var t = new Thread(() => SemaphoreS(threadName, 2));
t.Start();
}
var t1 = new Thread(() => SemaphoreS("4", 2));
t1.Start();
}
static SemaphoreSlim _semaphore = new SemaphoreSlim(3);
static void SemaphoreS(string name, int seconds)
{
Console.WriteLine("{0} 开始", name);
_semaphore.Wait();
Console.WriteLine("{0} 执行", name);
Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine("{0} 完成", name);
//释放信号量
//_semaphore.Release();
}
}

AutoResetEvent 设置俩个 事件标识 通过set 畅通信号 waitone 阻塞信号
于是可以看到 子线程1》主线程2》子线程2 =子线程3》主线程3
class Program
{
static void Main(string[] args)
{
var t = new Thread(() => Process());
t.Start()

最低0.47元/天 解锁文章
1595

被折叠的 条评论
为什么被折叠?



