C++ 多线程实现
最近码代码用到了多线程,总结一下相关用法,可能不是很全面,只是用到的一些基础。
1. 简单的多线程实现
#include <iostream>
#include <>
...
void* function(void)
{
cout<<"hello world"<<endl;
return 0;
}
int main()
{
...
int thread_num = 5;
pthread_t td[thread_num];
for(int i = 0;i<thread_num;i++)
{
int ret = pthread_create(&td[i],NULL,function,NULL);
if(!ret) cout<<"pthread_create error: error_code ="<<ret<<endl;
}
pthread_exit(NULL);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
这段简单的代码里包含了多线程的最基本的几个操作。首先,需要线程的id,然后需要创建线程(pthread_create函数),创建线程时需要将线程和调用的函数相关联起来。最后就是退出线程。
pthread_create函数有4个参数,第一个参数为线程的id,第二个为线程的参数,通常为NULL,第三个为线程调用的函数,第四个为线程调用的函数的参数。
pthread_exit(status)为显示调用线程的退出,释放线程所占用的资源。status为线程结束的返回值,像return 0里的0一样。
有时会使用pthread_join(pthread_t thread, void * * value_ptr),这个函数为一个阻塞函数,调用这个函数的线程会被挂起,直到这个函数完成,才会继续下去。
2. 线程函数多参数传参
像pthread_create函数里只有一个返回参数的地方,当线程函数有多个参数时,需要将参数整合成一个结构体进行传输,代码如下所示:
...
struct thread_para
{
var para1;
var para2;
}
...
void *thread_fun(void* arg)
{
thread *pstru;
pstru = (struct thread_para*) arg;
pstru->para1;
pstru->para2;
}
struct thread_para pstru;
pthread_create(&td[i],NULL,thread_fun,& (pstru));
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
3. 线程函数为类函数
当线程函数为类函数时,我们会发现,它会报错error: invalid use of non-static member function ,这是因为我们调用的这个类函数不是静态函数,通常这样是可以通过将函数修改成静态来解决。对于无法修改的函数,我们可以用一个静态函数将其封装。在静态函数中调用类内的函数。但是这样调用是有问题的,静态函数是没有this指针,所以我们需要将this指针作为参数传给静态函数,放上我代码中的一部分,仅作为这个概念的理解。
//类内
void faceboxes::detect2(const cv::Mat& img, std::vector<Detection>& dets) {
/*******省略*****************/
}
static void* faceboxes::thread_detect2(void *threadarg)//这个函数即为封装好的静态函数,里面完成了detect2函数的实现。
{
struct thread_data *my_data;
my_data = (struct thread_data *) threadarg;
faceboxes* pthis = my_data->pthis;
pthis->detect2((*my_data->ROI),(*my_data->det));
}
void faceboxes::thread_detect2_excute(int num , const cv::Mat& img, std::vector<Detection>& dets) //num 为第几个线程
{
int error;
td[num].pthis = this;
td[num].ROI = &img;
td[num].det = &dets;
error = pthread_create(&thread_id[num],NULL,thread_detect2,(void*)&td[num]);
if (error){
cout << "Error:unable to create thread," << error << endl;
exit(-1);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28