我在 OMNET++ 中编写了一个简单的多线程应用程序,它不会在工作线程中调用任何 OMNET++ API,并且按预期工作。我知道 OMNET++ 在设计上不支持多线程应用程序,但我想知道是否有任何机制可以用来在我的工作线程和主模拟线程中的代码之间建立桥梁。
更具体地说,我将一些数据保存在工作线程中的向量中,并且我想向模拟线程中的代码发出信号以使用它(生产者/消费者场景)。有什么办法可以实现这一点吗?
我需要设计自己的事件调度程序吗?
最佳答案
方法一
实现目标的最简单方法是在模拟线程中使用 selfmessage 并对工作线程进行小修改。工作线程应该修改一个公共(public)变量(两个线程都可见)。 selfmessage 应该定期检查这个变量的状态。
这个想法的示例代码:
// common variable
bool vectorReady;
// worker thread
if (someCondition) {
vectorReady = true;
}
// simulation thread
void someclass::handleMessage(cMessage * msg) {
if (msg->isSelfMessage()) {
if (vectorReady) {
vectorReady = false;
// reads vector data
}
scheduleAt(simTime() + somePeriod, msg);
}
公共(public)变量的声明位置取决于您如何创建和启动工作线程。
方法2
另一种方法是创建自己的调度程序并在每个事件之前添加一个条件。默认情况下,OMNeT++
使用 cSequentialScheduler
调度程序。它有方法takeNextEvent()
,调用该方法来获取下一个事件。您可以创建派生类并覆盖此方法,例如:
// cThreadScheduler.h
#include <omnetpp.h>
using namespace omnetpp;
class cThreadScheduler : public cSequentialScheduler {
public:
virtual cEvent *takeNextEvent() override;
};
// cThreadScheduler.cc
#include "cThreadScheduler.h"
Register_Class(cThreadScheduler);
cEvent* cThreadScheduler::takeNextEvent() {
if (vectorReady) {
vectorReady = false;
// reads vector data
}
return cSequentialScheduler::takeNextEvent();
}
在omnetpp.ini
中添加一行:
scheduler-class = "cThreadScheduler"
关于multithreading - 从工作/子线程访问主 OMNET++ 模拟线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45849770/