thread库为C++增加了线程处理能力,它提供简明清晰的线程、互斥量等概念,可以容易地创建多线程应用程序。thread库也是高度可移植的,它支持使用最广泛的windows和POSIX[Unix下应用程序共同遵循的一种规范 ]线程,用它编写的代码不需要修改就可以在windows、unix等操作系统之上编译运行。
使用thread库[ vs2010 ]
1.包含thread头文件及使用boost命名空间
#include<boost/thread.hpp>
using namespace boost;
2.因为thread库使用了date_time,所以使用时需要包含以下两个宏
#define BOOST_DATE_TIME_SOURCE
#define BOOST_THREAD_NO_LIB
3.创建线程对象
thread类是thread库的核心类,负责启动和管理线程对象。依据类的对象被创建时首先运行构造函数的思想。
创建线程对象的形式[调用不同的构造函数就导致形式不同]为:
thread my_thread_1( function );
thread my_thread_2( function,arg1,…,arg9 )
有三个构造函数,表明在创建对象时有三种不同的形式[传递给构造函数的参数不同 ]
(1)thread();
(2)template<class F> explicit thread(F f);
(3)template<class F, class A1, class A2…,class A9> thread(F f, A1 a1, A2 a2, …,A9 a9);
第(1)个构造函数不可被传递参数,【表示构造一个表示当前执行线程的线程对象】,第(2)、(3)两个构造函数的区别在于使用第三个构造函数可以指定传入调用函数的参数,最多可以传递9个参数。
此构造函数采用C++中模板的思想使得thread创建线程时可以对其构造函数传入任意类型的函数及参数。
4.使用等待当前线程的成员函数
join()一直阻塞等待,直到当前线程结束。
time_join()等待当前线程结束或者最多等待多少时间后返回[当当前线程已经结束但等待时间还未到时也返回]。
5.创建线程简单例子
新建控制台程序[配置VS2010工程环境:VS2010 boost库环境设置]
然后植入以下代码[ 不必在意代码实现细节 自己编码练习出来 ]:
#include "stdafx.h"
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
using namespace boost;
#define BOOST_DATE_TIME_SOURCE
#define BOOST_THREAD_NO_LIB
//----------------------------------
//函数声明
//----------------------------------
void print_string( const string &str );
int _tmain(int argc, _TCHAR* argv[])
{
thread my_thread_1( print_string, "hello" );
my_thread_1.join();
thread my_thread_2( print_string, "\nworld" );
my_thread_2.join();
getchar();
return 0;
}
//------------------
//打印字符串到标准流
//------------------
void print_string( const string &str )
{
int i;
for( i = 0; i < str.length(); ++i ){
cout << str[i];
}
}
【1】运行程序得到两个线程运行的结果:窗口中无论如何都是输出
hello
world
【2】不加两个线程对象的等待线程结束代码即去掉*_join()代码,则多次运行程序得到的结果为:
有时候是hello输出在前,有时候是world输出在前,有时候是hello或者world字符串的输出不连续,是helloworld随机排列的字符串。
其实这体现了线程的执行实质:从某种角度来说,线程就是在进程的另一个空间里运行的一个函数。现在本进程里面创建了两个线程,当每个线程对象被创建[主程序也相当于一个线程了 ]以后就开始执行此线程,从此多个线程交替被CPU拿去执行。根据CPU在每个时刻只能执行一个任务的特点,最后有3个线程交替运行,运行情况有多种:
(1)在程序运行时,在创建第二个线程my_thread_2之前就已经将第一个线程运行完毕,然后就将第二个线程my_thread_2的创建及运行完成,这个时候“hello”就出现在“world”的前面。
(2)在程序运行时,可能创建完第一个线程对象my_thread_1之后CPU就回到创建线程中的线程中[ main函数程序 ]来运行,一下子就完成了线程2 my_thread_2的创建及运行,然后CPU再继续运行线程对象1my_thread_1,这就使“world”出现在“hello”之前。
(3)当程序运行时,就有可能出现将my_thread_1线程创建完毕,执行一小会儿被打断去创建my_thread_2对象[ main函数程序 ],my_thread_2被执行一小会儿后CPU又去执行my_thread_1[此时创建线程的线程里木有了代码,但这个进程尚未完毕 ],如此以此种循环的方式将两个线程间接交替的执行完毕。这样子,输出的hello world就有可能是随机排列的了。
这充分体现了线程在时间上的同级性,跟代码出现的先后在宏观上无关[尤其是线程对象创建后,就基本上被CPU平等的执行着[设定了优先级除外 ] ]。这就是线程,一个时间段[微观内的小时间段 ]内可以执行多个函数。给人一种可以同时执行程序中多个不同任务的感觉。
Note Over。