需要加入头文件#include <pthread.h>
pthread_create (thread, attr, start_routine, arg)
thread | 指向线程标识符指针。 |
attr | 一个不透明的属性对象,可以被用来设置线程属性。您可以指定线程属性对象,也可以使用默认值 NULL。 |
start_routine | 线程运行函数起始地址,一旦线程被创建就会执行。 |
arg | 运行函数的参数。它必须通过把引用作为指针强制转换为 void 类型进行传递。如果没有传递参数,则使用 NULL。 |
pthread_exit(NULL);结束
c++11中的多线程
#include <thread>
头文件
#include <iostream>
#include <thread>
using namespace std;
void output(int i)
{
cout << i << endl;
}
int main()
{
for (uint8_t i = 0; i < 4; i++)
{
thread t(output, i);
t.detach();
}
getchar();
return 0;
}
t.detach
表示该线程在后台允许,无需等待该线程完成,继续执行后面的语句。
std::thread t{Task()};
当线程启动后,一定要在和线程相关联的thread
销毁前,确定以何种方式等待线程执行结束。C++11有两种方式来等待线程结束
- detach方式,启动的线程自主在后台运行,当前的代码继续往下执行,不等待新线程结束。前面代码所使用的就是这种方式。
- join方式,等待启动的线程完成,才会继续往下执行。假如前面的代码使用这种方式,其输出就会0,1,2,3,因为每次都是前一个线程输出完成了才会进行下一个循环,启动下一个新线程。
- 线程的创建
- 线程的执行方式,join或者detach
- 向线程函数传递参数,需要注意的是线程默认是以拷贝的方式传递参数的,当期望传入一个引用时,要使用
std::ref
进行转换 - 线程是movable的,可以在函数内部或者外部进行传递
- 每个线程都一个标识,可以调用
get_id
获取。