Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于NS3和std::线程的并行仿真

基于NS3和std::线程的并行仿真
EN

Stack Overflow用户
提问于 2016-02-21 16:21:17
回答 2查看 2K关注 0票数 3

我正在使用NS3框架运行不同配置的with模拟。我想使用std::线程在一个进程中同时运行许多(数百)模拟。

下面是我的代码,并修改了一些配置:

代码语言:javascript
运行
AI代码解释
复制
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;
}

当我只为作业中的一个作业运行这段代码时,它工作得很好,但是对于任何更大的数字(例如两个),我得到的输出如下:

代码语言:javascript
运行
AI代码解释
复制
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>").

实际上,在瓦伦丁运行它会带来数百个问题。

两个问题:

  • 我是否可能做错了什么,而NS3应该支持这一点?
  • 知道NS3不能并行运行多个模拟吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-22 23:14:41

简短的回答是:你不能用ns-3来完成这个任务。

长篇大论的答案是:使用多个进程而不是多个线程( ns-3库维护不受多线程一致保护的全局状态)。

我建议使用ns-3 python包装器轻松设置并行多处理作业。如果您想在默认的跟踪设置之外执行跟踪,这可能并不简单(在本例中,您可能需要在C++中执行自己的跟踪,在python中进行拓扑设置)

票数 1
EN

Stack Overflow用户

发布于 2016-02-25 20:17:50

我在这方面的工作是注释掉默认的2断言检查,然后新线程运行良好:

DefaultSimulatorImpl::调度(时间控制与延迟,EventImpl *事件){

// NS_ASSERT_MSG (SystemThread::Equals (m_main),“模拟器:调度线程-不安全调用!”);//第231行.}

DefaultSimulatorImpl::ScheduleNow {

// NS_ASSERT_MSG (SystemThread::Equals (m_main),“模拟器:ScheduleNow线程-不安全调用!”);//第284行.}

然后运行与valgring,以验证潜在的种族/mem问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35543906

复制
相关文章
ns3仿真的步骤
      在看了ns3的toturial和manual之后,发现里面介绍原理的东西很多,但是例子很少,只是介绍里面的东西咋用,但是 并没有说是介绍一个如何进行仿真的例子,所以开始仿真的时候,还是有很多的入门限制。       下面就简单的说一下ns3中网络仿真的过程,        创建节点        创建链路类型        为节点创建具有链路类型的设备        为节点装载协议栈        设置节点和网络的IP        配置业务应用        开始仿真        这个是一简单的仿真过程,其中还需要涉及到很多别的东西,因此需要更细节的考虑。       另外可以如下来考虑ns3的仿真过程,       CreateNodes ();       InstallInternetStack ();       InstallApplication ();      这三个步骤中,CreateNodes()包含了创建节点所需的netDevice、phy、mac、channel之类;      InstallInternetStack()包含了对其L3和L4层协议的加载以及网络IP的设置;      InstallApplication()是对节点业务的分配过程。
py3study
2020/01/07
2K0
C++11:基于std::queue和std::mutex构建一个线程安全的队列
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/52067929
10km
2019/05/25
10.8K0
使用tshark处理ns3仿真数据
众所周知,ns是一个开源的网络仿真软件,通过搭建自己的网络拓扑,我们可以得到一大堆仿真数据,可以选择保存tr文件也可以保存为pcap文件,下面主要讲的是如何使用tshark处理pcap文件。 tshark是Wireshark的命令行工具,正因为是命令行,所以处理速度是比Wireshark快不少,功能也更强,下面是我使用tshark处理pcap的一个例子: tshark -r "./bottleneckTcp-0-0.pcap" -R "ip.dst=="10.1.1.1"&&tcp.port==50000"
forrestlin
2018/05/23
1.1K0
C++11:基于std::unordered_map和共享锁构建线程安全的map
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/52072061
10km
2019/05/25
9.1K0
理解std::move和std::forward
std::move和std::forward只是执行转换的函数(确切的说应该是函数模板)。std::move无条件的将它的参数转换成一个右值,而std::forward当特定的条件满足时,才会执行它的转换。这就是它们本来的样子.这样的解释产生了一些新问题,但是,基本上就是这么一回事。
杨永贞
2022/06/08
1.8K0
理解std::move和std::forward
std::atomic和std::mutex区别
​模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。​在多线程调用下,利用std::atomic可实现数据结构的无锁设计。​​
音视频牛哥
2022/03/12
2.9K0
std::atomic和std::mutex区别
多线程和多进程的区别(并行编程 1)
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位,是“活的”
用户5760343
2022/01/10
5740
操作系统丶并发并行和线程
一丶操作系统   1.什么是操作系统: 操作系统是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在"裸机"上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行.   2.硬件:硬件是由许多不同功能的模块化的部件组合而成的,并在软件的配合下完成输入丶处理丶存储丶和输出等四个操作步骤.另外还可根据它们的不同功能分为5类.     1.输出设备(显示器丶打印机丶音响等)     2.输入设备(鼠标丶键盘丶摄像头等)     3.中央处理器     4.储存器(内存丶硬盘丶光盘丶U盘以及存储卡
py3study
2020/01/19
3690
操作系统丶并发并行和线程
多线程-并发并行-线程进程
并发:两个或多个事件在同一个时间段发生。 并行:两个或多个事件在同一时刻发生(同时发生)。
用户9857551
2022/06/28
3420
多线程-并发并行-线程进程
ns-3构建简单点对点网络
ns全称是network simulator,从上个世纪发展到现在,一共有三个版本,其中ns2是ns1的改进版本,把ns1中的脚本tcl改进成具有面向对象特性的otcl脚本,在ns2中,开发者需要同时使用c++和otcl来编写仿真场景。而ns3与ns2关系并不大,虽然同是使用c++开发的,但是ns3摈弃了otcl的使用,开发者只需要使用c++就可写出自己的仿真场景,然而由于ns3是2006才开始开发的,所以有些ns2的模块并没有在ns3中继承,但是ns3也有ns2没有的新时代的模块,例如wimax,lte。
forrestlin
2018/05/23
2.7K0
多线程和多进程的区别(并行编程 2)
优点:共享内存,尤其是进行IO操作(网络、磁盘)的时候(IO操作很少用cpu),可以使用多线程执行并发操作。
用户5760343
2022/01/10
5510
C#并行与多线程——Parallel并行
硬件线程又叫做逻辑内核,我们可以在”任务管理器“中查看”性能“标签页,就能查看电脑的线程数,我们常说的四核八线程,就是指这个,当然这里的四核八线程,其中的八线程是超线程技术,也就是一个核心对应两个线程,从而从硬件层面提升执行性能。
李郑
2019/12/09
5.4K0
线程并行学习笔记
同步和异步的本质区别是是否需要等待,比如一个方法在执行,必须等前面一个方法程执行完成,才可以执行,这就是同步。如果不需要等上一个方法执行完成,并行或者并发执行,这就是异步调用。
SmileNicky
2019/01/17
4140
操作系统中并发和并行的区别在于_线程是并行还是并发
· 并行是指两个或者多个事件在同一时刻发生,而并发是指两个或者多个事件在同一时间间隔发生
全栈程序员站长
2022/11/17
5770
操作系统中并发和并行的区别在于_线程是并行还是并发
4.0中的并行计算和多线程详解(一)
转自:https://www.cnblogs.com/sorex/archive/2010/09/16/1828214.html
vv彭
2021/01/27
1.6K0
4.0中的并行计算和多线程详解(一)
进程、线程、多线程、并发、并行 详解
进程、线程、多线程、并发、并行 首先,并行与并发都是程序多线程处理场景,因此,一旦提到并行与并发,那首先想到的是多线程。 #1 进程 狭义理解就是操作系统中一段程序的执行过程。那么广义上,进程是指一个具有一定独立功能的程序操作系统中关于某个数据集合进行的一次运行活动。是操作系统程序动态执行的基本单元。在传统的操作系统中,进程既是一个操作系统的基本分配单元,也是操作系统的基本执行单元。 进程共有三种状态:就绪、阻塞和运行 就绪态 就绪状态是指程序已达到可以运行的状态,只等CPU分配资源就可以运行
Autooooooo
2020/11/09
13.3K0
进程、线程、多线程、并发、并行 详解
深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper
在 C++ 编程中,有时候我们需要在不进行拷贝的情况下传递引用,或者在需要引用的地方使用常量对象。为了解决这些问题,C++ 标准库提供了三个有用的工具:std::cref、std::ref 和 std::reference_wrapper。这篇文章将深入探讨这些工具的用途、区别以及实际应用。
公众号guangcity
2023/09/02
1.9K0
深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper
C# 并行和多线程编程——认识和使用Task
 对于多线程,我们经常使用的是Thread。在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为task会比thread具有更小的性能开销,不过大家肯定会有疑惑,任务和线程到底有什么区别呢?
用户9127601
2021/11/01
8260
并行流线程数获取
这里用一个Set去接收并行流产生的线程id,对于上方的reduce函数我之前一篇博客已经讲过了,今天就来论证一下,到底并行流的线程数是否和JVM虚拟机可用的处理器数一致:
阿超
2022/08/17
6020
并行流线程数获取
图解并发与并行-分别从CPU和线程的角度理解
并发 曾经我作为一个不是很爱学习的孩子,在上学的时候经常做这样的事情:在数学课上补物理作业,数学课听懂了,物理作业也上交了。不谦虚的说,我是具备这样的能力,但很可惜没用对地方。
字母哥博客
2020/09/23
5670
图解并发与并行-分别从CPU和线程的角度理解

相似问题

基于NS3的IoT仿真

15

使用std::线程和良好实践并行化循环

12

基于Java和Java线程的打印机仿真

10

C+GSL并行仿真与R并行仿真

11

基于openmp的AES加密电路级并行仿真

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档