一、利用std::thread 实现多线程
1.针对普通函数的多线程
std::thread thread1(fun1,参数1,参数2,...,参数n);
std::thread thread2(fun2,参数1,参数2,...,参数n);
使用join()函数阻塞等待线程执行完:
thread1.join();
thread2.join();
使用detach()分离子线程,主线程不被阻塞继续执行
thread1.detach();
thread2.detach();
2.针对类的成员函数实现多线程
类名1 *对象1;
类名2 *对象2
std::thread th1(&类名1::成员函数,对象1,参数1,参数2,...,参数n);
std::thread th2(&类名2::成员函数,对象2,参数1,参数2,...,参数n);
也可以使用std::ref()函数来引用:
std::thread th1(&类名1::成员函数,对象1,std::ref(参数1),std::ref(参数2),...,std::ref(参数n));
同样可以使用 join()
和detach()
函数来进行操作。
二、利用openmp实现多线程
CMakeLists.txt的写法:
#******openMP 多线程****
find_package(OpenMP REQUIRED)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} ")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
包含的头文件:
#include <omp.h>
1.多线程
//设置使用的线程数
omp_set_num_threads(4);
可以使用omp_get_thread_num()
来查看分配的线程号;
#pragma omp parallel
{
多线程执行的代码;
std::cout<<"cnn:"<<omp_get_thread_num()<<std::endl;
}
大括号中的代码就会被执行4次,另外可以设置omp_set_num_threads()
来设置线程数
另外可以使用 #pragma omp parallel sections
关键字定义多线程的块:
设置omp_set_num_threads(2)
,定义几个sections就至少设置为多少个线程;
# pragma omp parallel sections
{
//*****线程1:******//
#pragma omp section
{
代码1;
std::cout<<"cnn:"<<omp_get_thread_num()<<std::endl; //查看分配的线程
}
//*****线程2:******//
#pragma omp section
{
代码2;
std::cout<<"cnn:"<<omp_get_thread_num()<<std::endl;
}
}
2.针对for循环多线程
首先可以设置使用的线程数
omp_set_num_threads(4);
方法1:
使用关键词:#pragma omp parallel for
#pragma omp parallel for
for(int i=0;i<10;i++)
std::cout<<"i is :"<<i<<std::endl;
方法2:
先使用 #pragma omp parallel
声明:
再使用#pragma omp for
定义for循环体;
#pragma omp parallel
{
#pragma omp for
for()
#pragma omp for
for()
}
错误写法:
#pragma omp parallel
{
#pragma omp parallel for
for()
}