下你所需,载你所想!
汇集开发技术源码资料

线程安全源代码之临界锁进阶玩法

:2.279KB :1 :2019-12-25 09:14:00

部分简介

下面说一下条件变量。关于条件变量的定义我就不啰嗦了,大家自己去百度一下就知道了,这里主要说一下条件变量的作用。
假如有多个线程同时操作一个变量,一条线程读,一条线程写,读取线程需要等待写入线程操作完成且这个变量值与某个已知值相等的时候做一些操作,这种情况下就可以用条件变量来控制线程,同时可以保证线程安全。

比如,你要写一个线程池,一般线程池在池中线程不够用的时候会自动创建新线程(当然前提是当前线程数小于设定的最大值),但创建一条线程到线程体开始执行需要一定的时间(虽然很短),你必须等待新线程创建完毕才能在当前线程中返回(当前方法),否则就不能精确控制线程数量了。那么问题来了,你在一条线程中创建另一条线程,如何才能知道另一条线程已经开始工作了呢?答案当然是使用条件变量了,虽然也可以用其他方法,比如在当前线程中循环判断线程数量是否已增加(在新线程执行体中会递增当前线程数),但使用条件变量无疑是更好的做法。

至于条件变量的用法,源码中有示例,这里就不多说了。

' 每 Enter 一次,就必须 Leave 一次,可重入
mCS.Enter ()
调试输出 (“已进入临界区...”)
mCS.Leave ()
调试输出 (“已离开临界区...”)
' 条件变量的用法,假设现有另一条线程不定期的修改 mValue 的值,我们需要在 mValue = 123 时做一些操作(另一条线程修改 mValue = 123 的时候需要调用 Signal 或 SignalAll 来唤醒等待线程),那么此时可以这样做:
mCS.Enter ()
.判断循环首 (mValue ≠ 123)
' 作用参考此方法的说明
mCS.Wait (-1)
.判断循环尾 ()
调试输出 (“执行到这里表示条件已符合预期,即 mValue 的值为 ” + 到文本 (mValue))
mCS.Leave ()
' 条件变量功能不支持 XP 系统

线程安全源代码之临界锁进阶玩法

热门推荐

相关文章