由ORB-SLAM引发的线程和进程的思考
近期博主作为一个小白在家魔改orbslam,orbslam的整体架构如下:
那么ORB-SLAM源码中这几个线程交替进行,当多个线程同时访问同一个资源的时候,就会存在一个问题,即多个线程的冲突。多线程同步和互斥有几种实现方法,都是什么? 线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。 用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量
多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明。 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。
临界区(Critical Section)和互斥量(Mutex) 两者都可以用于同一进程中不同子线程对资源的互斥访问。 互斥量是内核对象,因此还可以用于不同进程中子线程对资源的互斥访问。 互斥量可以很好的解决由于线程意外终止资源无法释放的问题。 临界区:一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。
那么线程和进程又有什么区别呢?
区别: 主要是线程依赖于进程的
线程是轻量级的进程,所消耗的资源和切换代价的比较小
一个进程可以包含多个线程,并且线程共享整个进程的资源,一个进程至少包含一个线程。
线程存在并发和资源争夺问题,当进程死掉后,会导致整个进程都会卡死掉,而进程死掉,不会影响其他的进程
线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志。
进程与线程的选择取决以下几点:
1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。 2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应 3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程; 4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求; 5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。