·使用线程可以把占据长时间的程序中的任务放到后台去处理
·程序的运行速度可能加快
可以释放一些珍贵的资源如内存占用等等。
但是多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
首先 我们现在在学校使用的和大赛使用的C++编程软件一般都是codeblocks(湖南省比赛是的,其他就不知道了)
但是在CodeBlocks中间 我们是不能直接使用线程的 需要设置一下
创建线程
线程的头文件与现场创建格式
#include pthread_create (thread, attr, start_routine, arg)
在这里,pthread_create 创建一个新的线程,并让它可执行。下面是关于参数的说明:
参数说明
参数说明
thread
指向线程标识符指针。保存的是线程id
attr
一个不透明的属性对象,可以被用来设置线程属性。您可以指定线程属性对象,也可以使用默认值 NULL。
start_routine
线程运行函数起始地址,即线程函数名。
arg
运行函数的参数。它必须通过把引用作为指针强制转换为 void 类型进行传递。如果没有传递参数,则使用 NULL。
创建线程成功时,函数返回 0,若返回值不为 0 则说明创建线程失败。
线程有创建 自然也就有结束
下面介绍一下结束线程的方法:
终止线程
使用下面的方法 我们可以结束线程
#include pthread_exit (status);
在这里,pthread_exit 用于显式地退出一个线程。通常情况下,pthread_exit() 函数是在线程完成工作后无需继续存在时被调用。
注意,main()函数是一个进程,也是可以使用上面的函数去结束它的。如果 main() 是在它所创建的线程之前结束,并通过 pthread_exit() 退出,那么其他线程将继续执行。否则,它们将在 main() 结束时自动被终止。
下面以一个实例来说明一下main()函数是否通过 pthread_exit() 退出的不同 下面是代码
#include #include
using namespacestd;#define NUM_THREADS 5
void* say_hello(void*args)
{
cout<< "Hello Runoob!" <
}intmain()
{
pthread_t tids[NUM_THREADS];//定义线程的 id 变量,多个变量使用数组
for(int i = 0; i < NUM_THREADS; ++i)
{//参数依次是:创建的线程id,线程参数,调用的函数,传入的函数参数
pthread_create(&tids[i], NULL, say_hello, NULL);
}//等各个线程退出后,进程才结束,否则进程强制结束了,线程可能还没反应过来;
pthread_exit(NULL);//俩次运行的不同之处在于有没有这一行
}
//有这一行的运行结果
Hello Runoob!Hello Runoob!
Hello Runoob!
Hello Runoob!
Hello Runoob!//上面是一种结果 由于多个线程之间是同步的 所以输出结果可以有多种 下面是我第二次运行的结果
Hello Runoob!Hello Runoob!
Hello Runoob!
Hello Runoob!
Hello Runoob!
//没有这一行的运行结果
Hello Runoob!//5个线程仅仅只有一个运行完成 其他4个直接中断运行//同样的 运行结果会有其他的情况 下面是我第二次的运行结果
Hello Runoob!Hello Runoob!
Hello Runoob!
Hello Runoob!
线程的参数传递
以下简单的实例代码使用 pthread_create() 函数创建了 5 个线程,并接收传入的参数。每个线程打印一个 "Hello Runoob!" 消息,并输出接收的参数,然后调用 pthread_exit() 终止线程。
//文件名:test.cpp
#include #include#include
using namespacestd;#define NUM_THREADS 5
void *PrintHello(void *threadid)
{//对传入的参数进行强制类型转换,由无类型指针变为整形数指针,然后再读取
int tid = *((int*)threadid);
cout<< "Hello Runoob! 线程 ID," << tid <
pthread_exi