在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static !

在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数。static定义的类的成员函数就是一个全局函数。

更多 参考  http://blog.csdn.net/ksn13/article/details/40538083

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

class Thread
{
    private:
        pthread_t pid;
    private:
        static void * start_thread(void *arg);// //静态成员函数
    public:
        int start();
        virtual void run() = 0; //基类中的虚函数要么实现,要么是纯虚函数(绝对不允许声明不实现,也不纯虚)
};

int Thread::start()
{
    if(pthread_create(&pid,NULL,start_thread,(void *)this) != 0) //´创建一个线程(必须是全局函数)
    {
        return -1;
    }
    return 0;
}

void* Thread::start_thread(void *arg) //静态成员函数只能访问静态变量或静态函数,通过传递this指针进行调用
{
    Thread *ptr = (Thread *)arg;
    ptr->run();  //线程的实体是run
}

class MyThread:public Thread
{
    public:
        void run();
};
void MyThread::run()
{
    printf("hello world\n");
}

int main(int argc,char *argv[])
{
    MyThread myThread;
    myThread.start();
    //test.run();
    sleep(1);
    return 0;
}
                          

编译运行:

[email protected]:~/myProg/pthreadCpp$ g++ main.cpp -lpthread
[email protected]:~/myProg/pthreadCpp$ ./a.out
hello world
[email protected]:~/myProg/pthreadCpp$ 
时间: 2025-01-01 21:23:01

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static的相关文章

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

c++ 类中模版成员函数

C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 template <class T>//类模版 class CTemplate{ public: void SWap(T &first, T &second){ } }; #include <iostream> class Single{ public: static Single

C++模板编程中只特化模板类的一个成员函数

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 //

c++ 调用pthread_create函数时,传入类中的成员报错。解决方法。

1.问题出现 我想把我的c程序转成c++的方式写,因为我觉得c++的面向对象方式特别的好用. 然后我开始移植了,当我想把在一个类函数中调用pthread_create来创建一个类. 我给的参数是 s=pthread_create(&id,NULL,run,NULL); //函数原型 void * THREAD_433::run(void *arg) { void * ret; using namespace std; cout<<"hello!\r\n"; retu

C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)

转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 templ

C++ 中模板类的模板成员函数在类外定义

因为很多书都没讲到这种情况, 曾经有这个问题但一直没答案,所以我一直以为模板类的模板成员函数只能在类内定义,直到我在某个开源代码里看到原来要加两个 template<>  ............ (T_T) template<typename T1> class MyObjectT { public: template<typename T2> void Foo(T2 v); }; template<typename T1> template<typ

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

MFC——4个基本类中的成员函数介绍

09121852 杜军 机械设计及理论 1. CMainFrame ActivateFrame使框架对用户可视并可用 CalcWindowRect每当主框架窗口的客户区尺寸发生变化或控制条的位置发生变化,需 要重新排列客户区时,调用该函数 Create调用以构造和初始化一个与CFrameWnd对象有关的Windows框架窗口 DefWindowProc该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理 DestroyWindow销毁指定的窗口 DoDataExchange 

创建一个三角形类并且使用成员函数计算三角形的周长和面积《2》

首先创建一个三角形类 class Triangle//三角形类 { public: void Setabc(double x, double y, double z);//置三边的值,注意要能成三角形 void Getabc(double *x, double *y, double *z);//取三边的值 double Perimeter(void);//计算三角形的周长 double Area(void);//计算并返回三角形的面积 private: double a, b, c; //三边为

mutable用于修改const成员函数中的成员变量

http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,