线程同步之同步中问题 学习总结
作者:@herry1995
本文为作者原创,转载请注明出处:https://www.cnblogs.com/Kernel001/p/8253204.html
目录
————— 线程同步的几种技术 ——————
一、原子锁 ATOM
二、临界区 CriticalSection
临界区 可以保证线程同步
{ 以下是伪代码: 在做个之前要引入Windows 单元 ,这是Delphi封装Windows下 VC++ 所有API } CreateCriticalSection CS; InitCriticalSection(CS); {--线程1执行代码--} var I: Integer; for I := 0 to 10 do begin EnterCriticalSection(CS); Memo1.add('a'); Memo1.add('a'); LeaveCriticalSection(CS); //Sleep(500); //睡0.5 s 作用: 防止线程2饥饿 一旦被抢去线程1就没有机会执行了,线程2 中的同样道理 end; {--线程1执行的代码--} {--线程2执行代码--} var I: Integer; for I := 0 to 10 do begin EnterCriticalSection(CS); Memo1.add('b'); LeaveCriticalSection(CS); // Sleep(500); end; {--线程2执行的代码--} DeleteCriticalSection(CS)
上面的代码不重要,理解其中的思想!
临界区存在的问题!
线程执行的过程是有条不紊的执行,但是并不能每次都能很好的控制哪个线程先执行!这就造成了线程之间的饥饿竞争计算机系统资源!所以这个现象应该尽量避免!
当心存在线程饥饿!
三、事件 Event
var hEvent1,hEvent2:THandle; hEvent1:= CreateEvent(参数……); hEvent2:= CreateEvent(参数……); {线程1代码} var I: Integer; for I:= 0 to 10 do begin WaitSingleForObject(hEvent1,INFINITE{等待时间,这里是 Windows下设定的无限时间});{-->一旦通过这里的阻塞,就会设置hEvent1为无信号状态,其他线程就没有执行的权限(或者其他线程就 不得执行)} {--线程1执行代码--} SetEvent(hEvent2);//设置事件2 有信号,此时线程2执行 end; {线程1代码} {线程2代码} var I: Integer; for I:= 0 to 10 do begin WaitSingleForObject(hEvent2,INFINITE{等待时间,这里是 Windows下设定的无限时间});{-->一旦通过这里的阻塞,就会设置hEvent1为无信号状态,其他线程就没有执行的权限(或者其他线程就 不得执行)} {--线程2执行代码--} SetEvent(hEvent1);//设置事件1 有信号,此时线程1执行 end; {线程2代码}
创建两个事件就可以有条不紊的执行,而且还可以控制线程执行的顺序,这样还避免了线程饥饿问题
四、互斥锁
var hMutex:THandle; hMutex := CreateMutex(参数……); {线程1代码} WaitforSingleObject(hMutex,INFINITE); {线程1执行代码} ReleaseMutex(hMutex); {线程1代码} {线程2代码} WaitforSingleObject(hMutex,INFINITE); {线程1执行代码} ReleaseMutex(hMutex); {线程2代码}
互斥锁方法与其他方法相比的好吃就是 互斥锁可以跨进程之间线程同步
当心存在线程饥饿!
五、信号量
标签:
线程同步时存在的问题
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一文搞懂MCP协议与Function Call的区别
· 一次Java后端服务间歇性响应慢的问题排查记录