简介
本文将介绍跨平台多线程库的设计方案,还将介绍开源三维图形框架OSG(Open Scene Graph)中的跨平台多线程库OpenThreads的初步理解的一些基础知识。
文章目录
正文
线程有关的概念
CPU亲缘性
通常所讲的一个CPU是指一个物理处理器,而一个物理处理器可以有多个核心,每一个核心又可以由两个处理器单元组成,每一个处理器单元就是一个逻辑处理器。注意这里的CPU指的是逻辑处理器,也就是对于通常讲的4核双线程CPU,逻辑处理器的数据量是8。逻辑处理器的含义的具体介绍可参考这里。
本文不打算具体展开介绍线程亲缘性的概念,对此感兴趣的读者可以参考这里:
What is and How does Setting CPU Affinity Improve Performance?
CPU亲缘性实际上是设置线程的CPU亲缘性,也就是控制指定的线程在哪一个逻辑处理器单元上运行。从前述参考资料可以看到,设置CPU亲缘性对一些CPU缓存密集型应用程序有一定的性能优化的作用。
线程优先级
线程优先级影响线程的调度结果,优先级高的线程获得运行机会的概率更高。
OpenThread库在Thread类中定义的线程优先级:
//线程优先级
enum ThreadPriority {
THREAD_PRIORITY_MAX, /**< The maximum possible priority */
THREAD_PRIORITY_HIGH, /**< A high (but not max) setting */
THREAD_PRIORITY_NOMINAL, /**< An average priority */
THREAD_PRIORITY_LOW, /**< A low (but not min) setting */
THREAD_PRIORITY_MIN, /**< The miniumum possible priority */
THREAD_PRIORITY_DEFAULT /**< Priority scheduling default */
};
Windows系统定义的线程优先级:
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL
Linux系统线程优先级在从-20到+19范围之内。因此不同OS中线程优先级的定义是不相同的。
因此OpenThreads中的线程优先级最终只能映射到具体操作系统的线程优先级上面去。
参考资料:
Windows进程和线程优先级的具体介绍可参考以下文章:
Processes, Threads, and Jobs in the Windows Operating System
线程调度策略
不同的线程调度策略使用不同的调度算法。
OpenThreads库中Thread类中定义的线程调度策略:
//线程调度策略
enum ThreadPolicy {
THREAD_SCHEDULE_FIFO, /**< First in, First out scheduling */
THREAD_SCHEDULE_ROUND_ROBIN, /**< Round-robin scheduling (LINUX_DEFAULT) */
THREAD_SCHEDULE_TIME_SHARE, /**< Time-share scheduling (IRIX DEFAULT) */
THREAD_SCHEDULE_DEFAULT /**< Default scheduling */
};
FIFO: 先进先出。高优先级线程抢占低优先级线程的时间片。属于实时调度,线程优先级起作用。
ROUND_ROBIN:轮询调度。在FIFO的基础上限制了每一个线程的最长运行时间。所有线程都可以获得执行的机会。属于实时调度,线程优先级起作用。
TIME_SHARE:分时调度。属于普通调度,线程优先级不