从工作/子线程访问主要的OMNET ++模拟线程

时间:2017-08-23 21:44:59

标签: multithreading omnet++

我在OMNET ++中编写了一个简单的多线程应用程序,它不会在工作线程中调用任何OMNET ++ API并且按预期工作。我知道OMNET ++不支持设计的多线程应用程序,但我想知道是否有任何机制可以用来在我的工作线程和主模拟线程中的代码之间建立桥梁。

更具体地说,我将一些数据保存在工作线程中的向量中,并且我想要通知模拟线程中的代码以消耗它(生产者/消费者场景)。有没有办法实现这个目标?

我是否需要设计自己的事件调度程序?

1 个答案:

答案 0 :(得分:3)

方法1
实现目标的最简单方法是在模拟线程中使用selfmessage并对工作线程进行小的修改。工作线程应修改公共变量(两个线程都可见)。并且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);
   }

公共变量声明的位置取决于您创建和启动工作线程的方式。

方法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"