线程同步
OS理解,处理该thread的时间到了,即使没有处理完,也是马上走人(当机立断),但是会打标记,一会儿来了,继续做(持之以恒)
1.原子锁(原子锁只能对运算符进行操作,可以通过flag简易实现)
产生原因
| 多个线程对一个数据进行原子操作,就会导致结果丢失。比如 |
2.互斥
产生原因
特点
| 在同一个时间下面,只能有一个线程具有互斥的特性(独占,排他),互斥句柄被持有的时候表现为无信号 |
| 没有被持有表现为有信号[可不可以被持有],WaitForXXX的时候,先等先得到 |
互斥的使用
互斥句柄式有状态的句柄
| HANDLE CreateMutex( |
| LPSECURITY_ATTRIBUTES lpMutexAttributes, |
| BOOL bInitialOwner, |
| LPCTSTR lpName |
| ); |
| |
| |
| BOOL ReleaseMutex(HANDLE hMutex); |
| |
| CloseHandle(); |
互斥句柄的理解
| 也是相当于一把锁,拿着的时候,锁上来做事情,同样在等待锁(互斥句柄)的线程就得等待 |
前面两个都是资源的抢占(都是加锁实现的)
3.事件(句柄为可等候句柄[事件的句柄可以有多个])
解决线程之间的协调工作
| HANDLE CreateEvent( |
| LPSECURITY_ATTRIBUTES lpEventAttributes, |
| BOOL bManualReset, |
| BOOL bInitialState, |
| LPCTSTR lpName |
| ); |
4.信号量(作用类似于事件)信号量句柄是可等候句柄[有信号就通过,没信号就不能通过]
| HANDLE CreateSemaphore( |
| LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, |
| LONG lInitialCount, |
| LONG lMaximumCount, |
| LPCTSTR lpName |
| ) |
| |
| BOOL ReleaseSemaphore( |
| HANDLE hSemaphore, |
| LONG lReleaseCount, |
| LPLONG lpPreviousCount |
| ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步