|
本帖最后由 frg0922 于 2014-6-12 14:40 编辑
临界区模式
临界区是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问如果有多个线程试图同时访问临界区,那么在有一个线 程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操 作共享资源的目的。
临界区在使用时以系统结构对象保护共享资源,并分别用 线程.进入临界区()或thread.entercritical()和线程.离开临界区()或者thread.leavecritical()函数去标识和释放一个临界区所用到的系统结构对象必须经过 线程.创建临界区()或者thread.createcritical()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能而且在程序不需要或退出的时候,必须调用 线程.删除临界区()或thread.deletecritical()释放临界区如下图所示:
线程A和线程B执行到临界区时,系统会随机选择谁先进入临界区(一般规则是谁先到临界区,谁先进入临界区,若是同时到,那么就系统随机分配),只要一方进入临界区,那么另一方就得等待,知道进入的线程离开临界区,系统才允许等待的线程才会进入临界区。
在使用临界区时,一般不允许其运行时间过长,只要进入临界区的线程还没有离开,其他所有试图进入此临界区的线程都会被挂起而进入到等待状态,并会在一定程度上影响程序的运行性能尤其需要注意的是不要将等待用户输入或是其他一些外界干预的操作包含到临界区如果进入了临界区却一直没有释放,同样也会引起其他线程的长时间等待换句话说,在执行了 线程.进入临界区() 语句进入临界区后无论发生什么,必须确保与之匹配的 线程.离开临界区()都能够被执行到虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。
举例:
2个线程向一个记事本输入内容,在存在临界区的情况,输入的数据很有条例和顺序但是在没有临界区的情况下,输入的数据就乱套了大家可以动手试试。- 空间 临界区测试
- 对象句柄 = 0
- 功能 喊话(内容)
- 句柄集1 = 系统.枚举("Notepad",1) // 使用1个记事本测试
- 如果(字符串.长度(句柄集1) == 0)
- 辅助.消息框("没有找到窗口")
- 返回 -1
- 如果结束
- // 通过父窗口获取子窗口
- 句柄集2 = 系统.枚举(句柄集1,3)
- 如果(字符串.长度(句柄集2) == 0)
- 辅助.消息框("没有找到窗口")
- 返回 -1
- 如果结束
- // 分割子窗口字符型句柄
- 变量 子句柄字符串数组
- 字符串.分割(句柄集2,"|",子句柄字符串数组)
- 变量 长度=0,序号=0
- 变量 句柄
- 数组空间.大小(子句柄字符串数组,长度)
- // 来确认我们的子窗口是我们需要子窗口
- 循环(序号 < 长度)
- 如果(窗口.类名(子句柄字符串数组[序号]) == "Edit")
- 句柄= 子句柄字符串数组[序号]
- 跳出
- 如果结束
- 序号 = 序号 + 1
- 循环结束
- 遍历(5)
- 线程.进入临界区(对象句柄)
- 窗口.提交按键(句柄,13) // 按一次回车键
- 辅助.等待(100)
- 窗口.提交字符串(句柄,内容) // 向窗口发送内容
- 辅助.等待(100)
- 窗口.提交按键(句柄,13) // 把内容发送出去
- 线程.离开临界区(对象句柄)
- 遍历结束
- 返回 0
- 功能结束
- 功能 执行()
- 对象句柄 = 线程.创建临界区()// 初始化临界区
- 线程句柄1= 线程.开启("临界区测试.喊话","123456789")
- 线程句柄2= 线程.开启("临界区测试.喊话","abcdefg")
- 线程.等待(线程句柄1,60*1000)//最长等待线程句柄1的线程执行1分钟
- 线程.等待(线程句柄2,60*1000)//最长等待线程句柄2的线程执行1分钟
- 线程.删除临界区(对象句柄) // 释放临界区
- 调试输出("程序执行完毕")
- 功能结束
- 空间结束
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|