当前位置: 首页 > news >正文

动易官方网站pc端网站建设价格明细表

动易官方网站,pc端网站建设价格明细表,英语做课后作业的网站,做淘宝客需要网站吗线程同步的手段很多 lock 是通过内存索引块 0 1 切换 进行互斥的实现 互斥量 信号量 事件消息 其实意思就是 一个 标记量 通过这个标记 来进行类似的互斥手段 具体方式的分析 代码在后 1.互斥量 Mutex 作用 非常类似lock 一个Mutex 名称来代替 lock的引用对象 2.信号量 Semaph…

线程同步的手段很多
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();Console.WriteLine("主线程过程1");_workerEvent.WaitOne();Console.WriteLine("主线程过程2");_mainEvent.Set();_workerEvent.WaitOne();Console.WriteLine("主线程过程3");Console.ReadKey();}private static AutoResetEvent _workerEvent = new AutoResetEvent(false);private static AutoResetEvent _mainEvent = new AutoResetEvent(false);static void Process(){Console.WriteLine("子线程过程1");_workerEvent.Set();_mainEvent.WaitOne();Console.WriteLine("子线程过程2");Console.WriteLine("子线程过程3");_workerEvent.Set();}
}

在这里插入图片描述
但是如果使用多个子线程发现 其实只有1个子线程能够识别这个 标识
在这里插入图片描述

ManualResetEventSlim 为了解决上诉 1个线程使用标识的问题 俩个线程测试通过 主线程set通行
子线程中reset阻塞 并且wait等待 ManualResetEvent 用waitone

class Program
{static void Main(string[] args){var t = new Thread(() => Process(1));t.Start();var t1 = new Thread(() => Process(2));t1.Start();Console.WriteLine("主线程过程1");_mainEvent.Set();Thread.Sleep(3);Console.WriteLine("主线程过程2");_mainEvent.Set();Thread.Sleep(3);Console.WriteLine("主线程过程3"); _mainEvent.Set();Console.ReadKey();}private static ManualResetEvent _mainEvent = new ManualResetEvent(false);static void Process(int i){_mainEvent.WaitOne();Console.WriteLine(i+"子线程过程1");_mainEvent.Reset();_mainEvent.WaitOne();Console.WriteLine(i + "子线程过程2");_mainEvent.Reset();_mainEvent.WaitOne();Console.WriteLine(i + "子线程过程3");}
}
class Program
{static void Main(string[] args){var t = new Thread(() => Process(1));t.Start();var t1 = new Thread(() => Process(2));t1.Start();Console.WriteLine("主线程过程1");_mainEvent.Set();Thread.Sleep(3);Console.WriteLine("主线程过程2");_mainEvent.Set();Thread.Sleep(3);Console.WriteLine("主线程过程3"); _mainEvent.Set();Console.ReadKey();}private static ManualResetEventSlim _mainEvent = new ManualResetEventSlim(false);static void Process(int i){_mainEvent.Wait();Console.WriteLine(i+"子线程过程1");_mainEvent.Reset();_mainEvent.Wait();Console.WriteLine(i + "子线程过程2");_mainEvent.Reset();_mainEvent.Wait();Console.WriteLine(i + "子线程过程3");}
}

在这里插入图片描述
CountdownEvent 达到指定次数 继续通行 否则 wait阻塞 signal记录次数 Dispose 释放

class Program
{static void Main(string[] args){Console.WriteLine("俩个线程");var t1 = new Thread(() => StartThread("线程1", 4));var t2 = new Thread(() => StartThread("线程2", 8));t1.Start();t2.Start();_countdown.Wait();Console.WriteLine("结束");_countdown.Dispose();Console.ReadKey();}static CountdownEvent _countdown = new CountdownEvent(2);//指定次数 如果设置3 那么 结束不会打印一直会阻塞static void StartThread(string message, int seconds){Thread.Sleep(TimeSpan.FromSeconds(seconds));Console.WriteLine(message);_countdown.Signal();//记录次数执行一次就会+1 如果不设置 那么不达到指定次数 也会一直 wait阻塞}
}

在这里插入图片描述SpinWait 自选锁 混合模式 用户模式 短时间循环等待 然后行不通即切换上下文 内核模式阻塞

class Program
{static void Main(string[] args){var t1 = new Thread(UserModeWait);//用户模式var t2 = new Thread(HybridSpinWait);//混合模式Console.WriteLine("用户模式");t1.Start();Thread.Sleep(1);_isOKUser = true;Console.WriteLine("混合模式");t2.Start();Thread.Sleep(5);_isOKSpin = true;Console.ReadKey();}static volatile bool _isOKUser = false; //volatile 修饰多个线程访问 最新值 存在内存中static volatile bool _isOKSpin = false;static void UserModeWait(){while (!_isOKUser){Console.Write("-不ok-");}Console.WriteLine();Console.WriteLine("用户模式OK");}static void HybridSpinWait(){var w = new SpinWait(); //先用户模式占用cpu资源等待循环9次 若还没等到执行通行 那么切换上下文 内核模式 阻塞 while (!_isOKSpin){w.SpinOnce();Console.WriteLine("混合模式上下文切换"+w.NextSpinWillYield);}Console.WriteLine("混合模式OK");}
}

在这里插入图片描述

ReaderWriterLockSlim 读写锁 就是 读可共享锁 写是互斥锁 当断点设置在写锁的过程中 可以看见 读取的时候被阻塞了

class Program
{static void Main(string[] args){new Thread(Read) { IsBackground = true }.Start();new Thread(Read) { IsBackground = true }.Start();new Thread(Read) { IsBackground = true }.Start();new Thread(() => Write("Thread 1")) { IsBackground = true }.Start();new Thread(() => Write("Thread 2")) { IsBackground = true }.Start();Thread.Sleep(TimeSpan.FromSeconds(10));Console.ReadKey();}static ReaderWriterLockSlim _rw = new ReaderWriterLockSlim();static Dictionary<int, int> _items = new Dictionary<int, int>();static void Read(){Console.WriteLine("读取");while (true){try{_rw.EnterReadLock();foreach (var key in _items.Keys){Console.WriteLine(Thread.CurrentThread.ManagedThreadId+ "读取字典"+key);Thread.Sleep(TimeSpan.FromSeconds(0.1));}}finally{_rw.ExitReadLock();}}}static void Write(string threadName){while (true){try{int newKey = new Random().Next(5);_rw.EnterUpgradeableReadLock();if (!_items.ContainsKey(newKey)){try{_rw.EnterWriteLock();_items[newKey] = 1;Console.WriteLine("{0}添加字典 {1}", threadName, newKey);}finally{_rw.ExitWriteLock();}}Thread.Sleep(TimeSpan.FromSeconds(0.1));}finally{_rw.ExitUpgradeableReadLock();}}}
}

在这里插入图片描述

http://www.yayakq.cn/news/7166/

相关文章:

  • 在线做漫画的网站秦皇岛市建设局网站关于装配式专家
  • 网站弹出信息怎么做宁波网络推广
  • 南宁网站怎么做seo写作网站后台账号密码忘了怎么办
  • php团购网站开发wordpress 分类目录id
  • 网站是com好点还是cn包装设计网官网
  • wordpress朋友圈搜索引擎优化规则
  • 免费开源网站深圳网站商城定制设计
  • 北京建设网站设计做网站的盈利模式
  • 做网站时的注册权起到什么作用文化传媒网站封面
  • 东莞做网站排名推广app最快的方法
  • 做婚庆网站有哪些内容营销网站定制的优势
  • 惠州有做网站的吗上海市建设工程备案查询网站
  • 网站模板 黑色韶关网站建设的公司
  • 如何开淘宝店做国外网站义乌网站建设技术托管
  • 免费域名查询网站广安网站建设
  • 北京网站空间电商培训机构
  • 潍坊网站建设8年做视频特效的网站有哪些
  • 网站收录就是没排名网址怎么做小程序类的二维码
  • 网站所需的主要功能深圳网络推广公司天涯问答
  • 北京网站设计浩森宇特南宁seo团队费用是多少
  • 优化网站架构电子商务主要是干什么的
  • 学校网站建设主要成绩昆明网站建设创意
  • 图片上传 网站建设教学视频打开edge是2345网址导航
  • 郑州网站建设方案报价济南制作网站公司吗
  • phpcms 手机网站模板手机如何打开电脑版网页
  • 宁波网站建设应届生怎么能创建自己的网站
  • 外包做网站的要求怎么写锦州建设局网站
  • 大连网站设计费用wordpress备份 ftp
  • 唐山网站制作案例个人开小公司的流程
  • 制作好的网站海底捞网络营销方式