五、多线程数据共享

本节主要记录std::mutex类,std::lock_guard类模板、std::lock函数模板。

1、创建和等待多个线程

多个线程的执行顺序是乱的,和操作系统的内部对线程的调度机制有关。使用容器存入线程对象,以这种方式操作多个线程比较方便。

阅读全文 »

四、线程传参详解

本节主要详细记录std::thread的构造函数,就是函数的形参列表。

1、传递临时对象作为线程参数

thread类中的detach()方法是一个大坑,它将简单的东西复杂化,需要谨慎处理!

阅读全文 »

三、线程启动、结束、创建线程多个方法

本节主要记录std::thread类以及join()detach()方法。

1、线程创建

主线程从main()函数开始执行,我们自己创建的线程,也需要从一个函数(初始函数)开始运行。一旦这个函数运行完毕,代表这个线程运行结束。

整个进程是否执行完毕的标志是:主线程是否执行完毕,如果主线程执行完毕,代表整个进程执行完毕了。一般情况下:如果其他子线程还没有执行完毕,那么这些子线程也会被操作系统强行终止。

阅读全文 »

一、并发与多线程的基本概念

1、并发的概念

两个或者更多的任务(独立的活动)同时发生(进行),一个程序同时执行多个独立的任务。

  • 以往,单核CPU某一个时刻只能执行一个任务,由操作系统调度,每秒钟进行多次所谓的“任务切换”是一种并发的假象,这种切换(上下文切换)有时间开销。

  • 多核CPU能够实现真正的并发执行多个任务(硬件并发)。

  • 使用并发的原因:主要是可以用时处理多件事,提高性能。

    阅读全文 »

1、lambda表达式

lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读。从本质上来讲,lambda表达式只是一种语法糖,因为所有其能完成的工作都可以用其它稍微复杂的代码来实现,但是它简便的语法却给C++带来了深远的影响。从广义上说,lamdba表达式产生的是函数对象。在类中,可以重载函数调用运算符(),此时类的对象可以将具有类似函数的行为,我们称这些对象为函数对象(Function Object)或者仿函数(Functor)。相比lambda表达式,函数对象有自己独特的优势。

阅读全文 »

原文:Understanding lvalues and rvalues in C and C++

我们在 C/C++ 编程中并不会经常用到 左值 (lvalue)和 右值 (rvalue)两个术语。然而一旦遇见,又常常不清楚它们的含义。最可能出现两这个术语的地方是在编译错误或警告的信息中。例如,使用 gcc 编译以下代码时:

阅读全文 »

1、Cyber RT的基本概念与 ROS 对照

ROS 应用于自动驾驶领域的不足:

  • 调度的不确定性:各节点以独立进程运行,节点运行顺序无法确定,因而业务逻辑的调度顺序无法保证;
  • 运行效率:ROS 为分布式系统,存在通信开销。
阅读全文 »

Apollo Cyber RT处于底层的实时操作系统(RTOS)算法模块之间,能够在保证高吞吐的情况下,又能低延迟的实时响应上层任务,并保证整个系统确定性的运转。

Apollo Cyber RT 框架核心理念是基于组件,组件有预先设定的输入输出。实际上,每个组件就代表一个专用的算法模块。框架可以根据所有预定义的组件生成有向无环图 (DAG)

在运行时刻,框架把融合好的传感器数据预定义的组件打包在一起形成用户级轻量任务,之后,框架的调度器可以根据资源可用性和任务优先级来派发这些任务。

阅读全文 »

Cyber RT组件注册以及动态创建过程

1、mainboard函数分析

mainboard是Cyber RT启动组件的主程序,程序的名称是由cyber/BUILD文件指定的,cyber_launch不过是调用了此函数,其入口函数main()位于cyber/mainboard/mainboard.cc中:

阅读全文 »

功能模块的启动过程(以Planning为例)

Apollo 3.5版本引入了中间件Cyber RT作为底层通讯与调度平台,Cyber RT以组件(component)的概念构建、加载各功能模块。Perception、Localization、Planning、Control等功能模块均作为Cyber RT框架的一个组件而存在,基于Cyber RT提供的调度程序mainboard加载运行。下面以Planning模块为例具体阐述。 Planning模块BUILD文件中生成binary文件的配置项如下:

阅读全文 »