为什么类中的线程函数必须要声明静态?

本文探讨了类的静态函数在多线程编程中的作用,指出静态成员函数可以作为线程启动函数,因为它不依赖于对象实例。非静态成员函数由于隐含的`this`指针无法直接作为线程函数,导致编译错误。通过传递对象的`this`指针,可以在静态成员函数中调用非静态成员。示例展示了如何创建和启动线程,并在子类中实现线程的逻辑。
摘要由CSDN通过智能技术生成

其实类的静态函数就跟全局函数是一个样子的, 只是调用的时候要加下个类修饰符而已.

至于为什么不能是非静态成员函数呢, 因为非静态成员函数都会在参数列表中加上一个this指针为为参数, 这样的话你写的线程函数就不符合调用规定了.
比如 DWORD WINAPI ThreadFun(LPVOID); 是非静态的,实际编译后,就会变成
DWORD WINAPI ThreadFun(LPVOID, CMyClass *this); 
这个函数就明显不能作为线程的函数了, 因为多了个参数.所以编译就过不了了.

 

参考地址:http://www.cnblogs.com/diegodu/p/4655036.html

 

它与设置成全局函数有一个好处:就是不用声明为friend成员即可访问对象的私有成员。
成员变量不用改成static的,你创建线程的时候把对象的“this”指针作为参数传递过去,就可访问了。

#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;
}

编译运行:

jxue@jxue-ubuntu:~/Downloads/algo$ g++ thread.cpp -lpthread -o thread
jxue@jxue-ubuntu:~/Downloads/algo$ ./thread
hello world

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值