不同OS下的多线程方案
C/C++的多线程编程在啊不同操作系统下有不同函数库可以进行调用,在Linux平台下,POSIX多线程库是,在windows平台下,有windows API或MFC库(VC对WIN32 API的封装),但是为了多线程程序在不同编译系统下的可移植性好,选用c++的库是比较合适/简便的。
线程相关的一些概念的说明
进程与线程的关系
进程是程序分配资源的最小单位,而线程是程序执行的最小单位(实际CPU时间就是分配给各线程的),简要来说,一个进程中可以有多个线程,而这些线程会共用进程中的资源(包括打开的文件、信号标识及动态分配的内存等)和地址空间,而每个执行的线程还会有自己的堆栈区和CPU寄存器状态。
线程的执行顺序和是否可执行是由系统的调度程序决定的,线程有优先级别,优先级别高的程序优先执行(但是同时也要维护进程执行时间分配的公平性)。
在多处理器的机器上,调度程序可以将多个线程放到不同的处理器上运行,这样可以使处理器任务平衡,并提高系统的运行效率。
在进程存在的基础上,我们还需要有线程存在的原因是:
1. 进程之间的通信(IPC方式包括有名/匿名管道、信号、信号量、消息队列、共享内存、套接字等)并不算方便,而进程之间因为是共享线程的资源(包括全局/静态变量)因此通信会比较方便,只是在多个线程需要访问(写)同一个变量时,需要注意线程同步(在查找值和改写值之间不中断)的问题。
2. 进程的开启和销毁的代价是远大于线程的,当然线程的开启和销毁也是有代价的,因此有线程池的出现(所谓线程池就是将开辟多个线程,维护一个线程池,每次需要新线程时,将从中选取空闲线程,线程用完之后再放回线程池)。
线程的同步与线程安全
线程同步是同一时刻对公共变量的值的认知需要保持一致(不会线程1以为公共变量是1,而线程2以为公共变量是2),如果确保在多线程编程环境中,线程能够正确地处理多个线程之间的共享变量,就称为线程安全。
线程之间共享的变量通常需要注意线程安全的问题,即保证多个线程之间访问同一个变量,不会出现一个线程对公共变量的读写被其他线程打乱的情形(此时需要保证该线程对关键区的访问为原子操作,禁止中断)。
因此通常需要加锁(加锁对象是需要访问公共变量的代码段,我们叫做临界区critical section)也就是常见的mutex(mutual exclusion),保证一个线程对公共变量进行读写操作之间不会被其他线程影响,等到Unlock mutex时变量才可以被其他线程访问。
举个在多线程环境中公共变量访问出错的例子
输出说明:预期结果是2e6,但是实际结果明显小于预期结果
产生原因:实际