C++多线程的实现

时间:2024-10-14 07:31:28

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