Multithreading 访问主OMNET++;工作/子线程中的模拟线程

Multithreading 访问主OMNET++;工作/子线程中的模拟线程,multithreading,omnet++,Multithreading,Omnet++,我用OMNET++编写了一个简单的多线程应用程序,它在工作线程中不调用任何OMNET++API,并且按照预期工作。我知道OMNET++在设计上不支持多线程应用程序,但我想知道是否有任何机制可以用来在工作线程和主模拟线程中的代码之间架起一座桥梁 更具体地说,我将一些数据保存在工作线程中的向量中,并且我希望向模拟线程中的代码发送信号以使用它(生产者/消费者场景)。有没有办法做到这一点 我需要设计自己的事件调度器吗?方法1 实现目标的最简单方法是在模拟线程中使用selfmessage,并对工作线程进行

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

更具体地说,我将一些数据保存在工作线程中的向量中,并且我希望向模拟线程中的代码发送信号以使用它(生产者/消费者场景)。有没有办法做到这一点


我需要设计自己的事件调度器吗?

方法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++
使用
csSequentialScheduler
调度器。它具有方法
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();
}

谢谢你的回答。我在我的代码中做了完全相同的事情。但是,由于我正在寻找接近实时的性能,上述方法对我不适用。这就是为什么我在寻找一种方法,向模拟线程发送一个信号,通知它缓冲区中的数据已经就绪。与您的方法类似,轮询共享向量不是我想要的。我正在考虑一种方法来修改OMNET++事件调度器,以便它在调度下一个挂起事件之前检查共享向量。有什么方法/教程可以做到这一点吗?我已经编辑了我的答案,并为自己的调度程序添加了一个示例代码。
scheduler-class = "cThreadScheduler"