Я использую инфраструктуру NS3 для запуска симуляций Wi-Fi с различными конфигурациями. Я хочу использовать std::thread для одновременного запуска многих (сотней) симуляций в одном процессе.
Вот мой код с отредактированной конфигурацией:
void simulation(RateAdaptation rate_adaptation,
const bool channel_fading,
// In meters, between AP and station.
const uint32_t distance)
{
ns3::SeedManager::SetSeed(++seed);
ns3::NodeContainer station_node, ap_node;
station_node.Create(1);
ap_node.Create(1);
ns3::YansWifiChannelHelper channel;
channel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
channel.AddPropagationLoss( "ns3::LogDistancePropagationLossModel");
// About 130 lines of more configuration for the simulation and
// function parameters.
ns3::Simulator::Stop(ns3::Seconds(10.0));
ns3::Ptr<ns3::FlowMonitor> flowmon;
ns3::FlowMonitorHelper *flowmonHelper = new ns3::FlowMonitorHelper();
flowmon = flowmonHelper->InstallAll();
ns3::Simulator::Run();
ns3::Simulator::Destroy();
flow_output(flowmon, flowmonHelper);
}
int main(int argc, char *argv[])
{
std::vector<std::thread> jobs;
for (uint32_t i = 0; i < 20; ++i)
{
uint32_t varying_distance = 5*(i+1);
jobs.push_back(std::thread(simulation,
RateAdaptation::Aarf,
false,
varying_distance));
}
for (auto it = jobs.begin(); it < jobs.end(); ++it)
{
it.join();
}
return 0;
}
Когда я запускаю этот код только для одного задания в jobs, он работает идеально, но для любого большего числа (скажем, двух) я получаю следующий вывод:
assert failed. cond="SystemThread::Equals (m_main)", msg="Simulator::ScheduleDestroy Thread-unsafe invocation!", file=../src/core/model/default-simulator-impl.cc, line=289
terminate called without an active exception
Command ['[redacted]'] terminated with signal SIGIOT. Run it under a debugger to get more information (./waf --run <program> --comm and-template="gdb --args %s <args>").
И действительно, запуск его в Valgrind возвращает сотни проблем.
Два вопроса:
- Возможно ли, что я что-то делаю не так, и NS3 должен это поддерживать?
- Известно ли, что NS3 не может запускать несколько симуляций параллельно?