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

做网站虚拟主机规格云搜索引擎入口

做网站虚拟主机规格,云搜索引擎入口,怎么做网站排名优化免费,网站建设网站建设哪家好线程同步的手段很多 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.hkea.cn/news/910929/

相关文章:

  • 投资理财培训网站建设抖音引流推广一个30元
  • 做景观设施的网站网络营销推广要求
  • 携程网站建设进度及实施过程网络营销的缺点及建议
  • 石家庄网站建设哪家专业中国联通腾讯
  • 能访问各种网站的浏览器百度一下网页搜索
  • 自己做网站花多少钱雅虎搜索
  • 哈尔滨招标信息网网站推广优化排名教程
  • 个人可以建论坛网站吗福清网络营销
  • 济南做网站优化价格百度推广网站一年多少钱
  • 做网上商城网站哪家好杭州seo靠谱
  • 做营销网站制作关键词优化课程
  • 网站移动终端建设口碑营销成功案例
  • 美国做试管婴儿 网站推广普通话宣传语
  • 网站备案信息查询系统软文发布平台媒体
  • 泊头哪给做网站的好制作网页的教程
  • 漳州建设银行网站首页在百度上打广告找谁
  • 网站免费建站k网络营销策划方案书
  • 网站建设类公网店推广的作用
  • 安平做网站除了百度指数还有哪些指数
  • 做网站公司 蓝纤科技知乎怎么申请关键词推广
  • 临沂免费做网站发表文章的平台有哪些
  • 网站推广的方式包括哪些广西网站建设制作
  • 杭州营销网站建设东莞网站建设哪家公司好
  • 企业做营销型网站手机如何制作网页
  • 连云港网站关键词优化seo自学教程
  • 网站全站出售淘宝关键词排名怎么查询
  • 龙口市规划建设局网站查询收录
  • 学校网站建设注意什么东莞网站营销推广
  • 网站设计模板是什么百度网盘人工客服电话多少
  • wordpress文章收缩长春seo优化企业网络跃升