• C++ 在类里面使用多线程技术


    有很多时候,我们希望可以在C++类里面对那些比较耗时的函数使用多线程技术,但是,C++类的成员函数的函数指针不能直接做为参数传到pthread_create,主要因为是C++成员函数指针带有类命名空间,同时成员函数末尾是会被C++编译器加上可以接收对象地址的this指针参数。因此需要将成员函数做一定的转化,将其转化为不被编译器加上this指针,而由我们自己来为该函数维护”this”指针即可。

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <time.h>
    #include <unistd.h>
    #include <pthread.h>
    using namespace std;
    class Test
    {
        public:
            int sum;
            int cnt;
        Test(){sum=0;}
        public:
            int insert();
            void * insert_pth(void*);
            void lanch();
    };
    int Test::insert()
    {
        sleep(2);
        sum+=1;
    }
    void * Test::insert_pth(void*)
    {
        insert();
    }
    void Test::lanch()
    {
        pthread_t pth;
        pthread_create(&pth,NULL,insert_pth,NULL);
    }
    int main()
    {
        Test t;
        t.lanch();
        return 0;
    }
    

    只需将insert_pth变化为static函数,同时将insert逻辑代码转移到insert_pth即可:

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <time.h>
    #include <unistd.h>
    #include <pthread.h>
    using namespace std;
    class Test
    {
        public:
            int sum;
            int cnt;
        Test(){sum=0;}
        public:
            int insert();
        static  void * insert_pth(void*);
            void lanch();
    };
    int Test::insert()
    {
        sleep(2);
        sum+=1;
        printf("%d insert.....
    ",sum);
    }
    void * Test::insert_pth(void* __this)
    {
        Test * _this =(Test *)__this;
        sleep(2);
        _this->sum+=1;
        printf("%d insert.....
    ",_this->sum);
    }
    void Test::lanch()
    {
        pthread_t pth;
        pthread_create(&pth,NULL,insert_pth,(void*)this);
    }
    int main()
    {
        Test t;
        t.sum=0;
        t.lanch();
        sleep(5);
        return 0;
    }
    

    注意:

    在 XXX_pth()函数内容尽量不要调用类的其它成员函数,否则成员函数将无法获取正确的this指针而操作错误内存,从而导致segmantation fault

    总结:

    • 将线程函数声明为静态函数;
    • 创建线程时传递进去this指针;
    • 在线程函数中使用传进来的this指针调用类的成员,特别注意调用类的成员函数时要避免segmantation fault错误。
  • 相关阅读:
    java怎么导入一个项目到eclipse
    JDK安装与环境变量配置(链接by网络)
    配置安装ecplise跑项目
    电脑缺少**.dll文件
    Microsoft-Office-Professional-Plus-2007
    win7如何恢复以前的ie版本
    maven安装及maven项目导入流程(网络链接)
    LoadRunner录制Web协议的脚本 (by网络)
    spring中jdbc.properties用法
    linux 安装 mysql
  • 原文地址:https://www.cnblogs.com/chay/p/10587490.html
Copyright © 2020-2023  润新知