multithreading - 从工作/子线程访问主 OMNET++ 模拟线程

标签 multithreading omnet++

我在 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/

相关文章:

java - JVM线程调度算法是什么?

c++ - 将参数移动到 std::thread 中?

c++ - 当未存储返回值时,std::async不会生成新线程

omnet++ - 在 Veins 的 MAC 层中实现的 ECDA 中的 WSM 优先级

c++ - 静脉:如何验证重新路由是否使用用户设置算法

omnet++ - 在 Veins 中运行模拟时,可以将控制台输出转储到文件中

c++ - 多速率线程

c++ - 静脉模拟终止调用 openssl ECDSA_SIG_get0 函数

docker - 在Windows上使用x11转发在docker内部运行Omnet++。 SSH不起作用

java - 在 Java Swing GUI 中让线程不断运行和更新文本框的最佳方法是什么