Windows多线程同步



多线程同步的意义:细分任务,充分利用CPU,提升效率。

概念:
  1. 间接制约关系(互斥):两个线程共同享有某个资源,需要对该资源进行互斥访问,则它们的关系是“互斥”。互斥则产生先后,所以“互斥”是一种特殊的同步。

  2. 直接制约关系(同步):一个线程需调用另一个线程运行的结果才能继续进行,则它们的关系是“同步”。“同步”包含互斥。

实现方法:

  1. event
   (1)CreateEvent( );
   (2)OpenEvent( );
   (3)SetEvent( );
   (4)ResetEvent( );

  2. mutex
   (1)CreateMutex( );
   (2)OpenMutex( );
   (3)ReleaseMutex( );

  3. CriticalSection
   (1)InitializeCriticalSection( );
   (2)DeleteCriticalSection( );
   (3)EnterCriticalSection( );
   (4)LeaveCriticalSection( );

  4. Semaphore
   (1)CreateSemaphore( );
   (2)OpenSemaphore( );
   (3)ReleaseSemaphore( );

  5. 公用函数
   (1)WaitForSingleObject( );
   (2)CloseHandle( );


区别:
  1. CriticalSection与Mutex都有“线程所有权”概念,当程序通过WaitForSingleObject(EnterCriticalSection)语句后,当前线程即拥有该互斥量(关键段),直至其它线程占有它。只可处理线程的间接制约关系(互斥),不可处理线程的直接制约关系(同步)。

  2. Event与Semaphore可以处理线程的直接制约关系(同步)。

  3. Mutex,Event和Semaphore都可以用于跨进程的线程互斥同步,但只有“Mutex”可以解决“遗弃”问题,所以跨进程用Mutex进行线程同步安全。

  遗弃问题:当线程占有Mutex,Event或Semaphore时突然终止,并未释放时(ReleaseMutex,ResetEvent,ReleaseSemaphore),其它等待中的线程(WaitForSingleObject)可能会因再也得不到资源而一直等待下去。

  线程拥有权:thread( )内部执行的是一个死循环,第一次通过WaitForSingleObject后,thread( )拥有了mutex,其它等待该mutex的线程需要等待thread( )释放(ReleaseMutex(mutex)),否则一直等待。但thread( )第二次到达WaitForSingleObject时,仍能通过,无需等待。

thread( )
{
  while(1)
  {
    WaitForSingleObject(mutex, INIFINITE);
           .
           .
           .
     //结束
  }
}

更加系统具体的内容请参考 【Windows多线程同步】
本文对应 【Demo】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘风-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值