线程同步

用户方式同步具有速度快的优点。但是它的缺点特是显而易见的。首先,用互锁函数家族的时候,这些函数只能用在单值数据上 如果用关键代码段的话,只能对单个进程中的线程进行同步。而且容易出现死琐,而且不能设置等待时间 那么内核对象就克服了用户方式同步的几个缺点,能够在不同进程间对线程实施同步,而且处理完全不止在单值数据上。但是内核方式同步线程时,必须将线程进入到内核方式,这样就使处理速度大大降低。这也是内核方式的缺点,所以还是能用用户方式处理的就用用户方式来处理。 现在来说下一个很多内核对象都具有的特性,这就是signaled/nonsignaled特性。 这个特性是这样的:在内核对象处于运行状态时,他就是nonsignaled状态,当内核对象运行结束时,就会处于signaled状态。在内核对象中是用一个bool值来表示的。所以查看内核对象的状态很容易。只要查这个值就可以了。所以当线程要等待的内核对象处于signaled状态时,那么这个线程就可以被CPU调度,否则处于等待状态。 拥有这个特性的内核对象有: .Processes · File change notifications · Threads · Events · Jobs · Waitable timers · Files · Semaphores · Console input · Mutexes 现在就来重点说下Event,waitable timer,Semaphore,Mutex.这四个用的比较多。 在说这四个内核对象之前先来说下能让线程进入等待状态的函数,也就是去等待上面四个内核对象的状态的函数。他们有 DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMillisecounds) 参数: 第1个参数就是要等待的对象的HANDLE,可以是上面四个中的一个。 第2个参数是等待超时时间。 返回值 WAIT_OBJECT_0//成功等待。也就是内核对象已经为signaled,线程成为可调度线程 WAIT_TIMEOUT//因为超时,线程重新唤醒,成为可调度的 WAIT_FAILED//将一个错误的值传递给WaitForSingleObject,比如传递了一个无效句柄。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值