2017-08-23 101 views
1

我在OMNET ++中編寫了一個簡單的多線程應用程序,它不在工作線程中調用任何OMNET ++ API,並且按預期工作。我知道OMNET ++不支持設計的多線程應用程序,但我想知道是否有任何機制可以用來在我的工作線程和主模擬線程中的代碼之間建立橋樑。從工作/子線程訪問主OMNET ++模擬線程

更具體地說,我在工作線程中將一些數據保存在一個向量中,並且想要在仿真線程中發信號通知代碼(生產者/消費者場景)。有什麼辦法可以做到這一點?

我是否需要設計自己的事件調度程序?

回答

2

方法1
來實現自己的目標的最簡單方法是使用模擬線程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" 
+0

感謝您的回答。我在我的代碼中完全一樣。但由於我正在尋找接近實時性能的方法,因此上述方法對我無效。這就是爲什麼我正在尋找一種方法向仿真線程發送信號,通知它緩衝區中的數據已準備就緒。輪詢共享矢量,與您的方法類似,不是我正在尋找的。 – ManiAm

+0

我正在考慮修改OMNET ++事件調度程序的方法,以便它在調度下一個未決事件之前檢查共享向量。有什麼方法/教程來做到這一點? – ManiAm

+1

我編輯了我的答案併爲自己的調度程序添加了示例代碼。 –