Mutex - WinAPI - MetaTrader 5 库
为什么这是必要的
全局变量、磁盘或内存映射文件、重要的操作程序都不再是问题了!
您将了解执行的算法不会同时通过不同的进程处理相同的数据是多么重要。因为它可能会导致意想不到的效果:一个进程正在写入,另一个进程正在读取并做出一些决定,并同时更新这些数据。
在这种情况下,如果第一个进程的数据写入尚未完成,则可能会导致第二个进程的工作不正确,从而导致数据损坏。
我们使用的对象穆特瓦尔前任换句话说,包含操作系统互斥体。
互斥体非常简单。我们使用类似于中描述的原理本文:创建对象时锁定资源,删除对象时释放资源。
互斥体的使用是在两个类中实现的。
事实是,互斥锁释放Mutex资源并删除后'}'。通过这种方式实现了必要的灵活性
//------------------------------------------------------------------ 类 CMutexSync 班级互斥同步 { HANDLE64 m_mutex;// 正在创建的互斥体的描述符 民众: CMutexSync() { m_mutex=无效的; } 虚拟的~CMutexSync() { 销毁(); } 布尔值创建(LPCTSTR名称){ m_mutex = CreateMutexWX(0,错误的, 姓名);返回(m_互斥!=无效的); } 空白销毁() { CloseHandleX(m_mutex); m_互斥=无效的; } HANDLE64 获取()常量{返回(m_互斥体); } };//------------------------------------------------------------------ 类 CMutexLock 班级互斥锁 { HANDLE64 m_mutex;// 被锁定的互斥体描述符 民众: CMutexLock(CMutexSync &m, DWORD dwWaitMsec) { m_mutex=m.Get();常量DWORD res=WaitForSingleObjectX(m_mutex, dwWaitMsec); }// 捕获对象构造过程中的互斥量 ~CMutexLock() { ReleaseMutexX(m_mutex); }// 当对象被移除时释放互斥体};
由于互斥体的锁定原理,使得代码美观且可读。它将代码从 WinAPI 函数中解放出来
在此示例中,我们将同步两个图表中两个脚本的循环操作。
第一个脚本执行某些操作的时间过长(示例中为 2 秒)。第二个脚本快速执行操作(0.2 秒)。
我们的任务是在第一个脚本完成当前迭代之前不允许快速脚本的新迭代。
输入 整数睡觉=200;//------------------------------------------------------------------ 空白 启动时() { 睡觉(5000);// 等待脚本出现在第二个图表上 CMutexSync 同步;// 同步对象 如果(!sync.Create(“本地\测试”)){打印(象征()+“MutexSync 创建错误!”);返回; } 打印(象征()+“ MutexSync 创建成功!睡眠 =”, 睡觉); 为了(整数我=0;我<10;我++) { CMutexLock 锁(同步,(DWORD)INFINITE);// 在循环的这个括号中锁定一个片段// 这里发生互斥锁的等待和锁定 打印(象征()+“锁定范围”);睡觉(睡觉); } }
结果
Mutex (EURUSD,M1) EURUSD MutexSync 创建成功!睡眠=2000
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD MutexSync 创建成功!睡眠=200
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
互斥体 (EURUSD,M1) EURUSD 锁定范围
互斥体 (AUDCAD,H1) AUDCAD 锁定范围
该库的工作方式与 32/64 位计数类似内存映射。
祝您好运、大赚!
附件下载
📎 mutex.mqh (3.26 KB)
📎 mutex.mq5 (1.21 KB)
Source: MQL5 #1835
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
