gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:54:30 25 4
gpt4 key购买 nike

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

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

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

最佳答案

方法一
实现目标的最简单方法是在模拟线程中使用自消息和对工作线程的小修改。工作线程应该修改一个公共(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)变量的声明位置取决于您如何创建和启动工作线程。

方法二
另一种方法是创建自己的调度程序并在每个事件之前添加一个条件。默认 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com