|
|

分享源码
| 界面截图: |
- |
| 是否带模块: |
- |
| 备注说明: |
- |
必须强调的安全前提
这个方案的线程安全是有严格前提的,破一条就可能出问题:
单写原则:只能有一个线程调用 有序尾插键,多写必须加临界区;
有序原则:新键的字典序必须 ≥ 当前数组最后一个键,例程里的校验建议保留;
不扩容原则:初始化一次性分配足够容量,运行中绝不调用 重定义数组();
顺序原则:写入永远是「先写元素,后更计数」,顺序不能颠倒;
只增不删、严格递增的场景下,这个方案的性能和简洁度都是最优的。
| 窗口程序集名 | 保 留 | 保 留 | 备 注 | | 窗口程序集_启动窗口 | | | | | 变量名 | 类 型 | 数组 | 备 注 | | 键数组 | 文本型 | 2000 | | 有效成员数 | 整数型 | | | 停止测试 | 逻辑型 | | | 总cha询次数 | 整数型 | | | 错误次数 | 整数型 | | | 统计许可区 | 整数型 | |
有效成员数 = 0 计次循环首 (1000, i ) 键数组 [i ] = “key_” + 文本补零 (到文本 (i ), 4 ) 有效成员数 = 有效成员数 + 1 计次循环尾 () 停止测试 = 假 总cha询次数 = 0 错误次数 = 0 统计许可区 = 创建进入许可证 () 计次循环首 (8, i ) 启动线程 (&读线程工作, , ) 计次循环尾 () 启动线程 (&写线程工作, , ) 延时 (10000 )停止测试 = 真 延时 (500 ) 信息框 (“多线程安全验证完成” + #换行符 + #换行符 + “总cha询次数:” + 到文本 (总cha询次数 ) + #换行符 + “错误次数:” + 到文本 (错误次数 ) + #换行符 + “最终有效成员数:” + 到文本 (有效成员数 ), 0, “验证结果”, )| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 目标序号 | 整数型 | | | | 目标键 | 文本型 | | | | 查到下标 | 整数型 | | | 置随机数种子 () 判断循环首 (取反 (停止测试 ))  目标序号 = 取随机数 (1, 有效成员数 ) 目标键 = “key_” + 文本补零 (到文本 (目标序号 ), 4 )  查到下标 = 二分查找下标 (目标键 )  如果真 (查到下标 = -1 或 键数组 [查到下标 ] ≠ 目标键 )  进入许可区 (统计许可区 )  错误次数 = 错误次数 + 1  退出许可区 (统计许可区 )
进入许可区 (统计许可区 ) 总cha询次数 = 总cha询次数 + 1 退出许可区 (统计许可区 ) 判断循环尾 () 计次循环首 (2000, i ) 如果真 (停止测试 ) 跳出循环 () 新键 = “key_” + 文本补零 (到文本 (1000 + i), 4) 有序尾插键 (新键 ) 延时 (1 ) 计次循环尾 ()补零数 = 总长度 - 取文本长度 (原文本 ) 如果真 (补零数 ≤ 0 ) 返回 (原文本 )返回 (取重复文本 (补零数, “0”) + 原文本)| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 左 | 整数型 | | | | 右 | 整数型 | | | | 中间 | 整数型 | | | | 比较结果 | 整数型 | | | | 当前有效数 | 整数型 | | |
当前有效数 = 有效成员数 左 = 1 右 = 当前有效数 判断循环首 (左 ≤ 右 ) 中间 = (左 + 右 ) ÷ 2  比较结果 = 文本比较 (键数组 [中间 ], 目标键, 假)  如果真 (比较结果 = 0 ) 返回 (中间 ) 如果真 (比较结果 < 0 )  左 = 中间 + 1  如果真 (比较结果 > 0 )  右 = 中间 - 1   判断循环尾 ()返回 (-1 )最后位置 = 有效成员数 如果真 (最后位置 ≥ 取数组成员数 (键数组 )) 返回 (假)
如果真 (最后位置 > 0 且 文本比较 (新键, 键数组 [最后位置 ], 假) < 0 ) 返回 (假)
键数组 [最后位置 + 1 ] = 新键 有效成员数 = 最后位置 + 1 返回 (真)
|
|