多线程用this指针来传递参数(整理)

整理自CSDN的论坛中,地址:https://bbs.csdn.net/topics/390703249

0.能够用this指针传递参数的原因是,线程之间的内存地址用的是同一套,即线程A中指针1指向的位置在线程B中仍然成立。

1.不同的线程不是两个独立的程序:线程不是进程(process是你说的程序) 

2.线程函数必须是全局函数或者是静态成员函数:https://www.cnblogs.com/Stephen-Qin/p/11575356.html

 静态成员函数则属于类, 不属于对象.  而this指针是指向对象自己的指针,即有了对象才有this指针.  所以你不能在线程函数中直接使用this指针, 因为线程函数中根本就没有这个东西,所以需要传进去,然后进行类型转换.
如果你研究得深入一点, 那么你就会知道, this指针, 并不是"成员变量", 而是从函数中传进去的. 即所有的非静态成员函数都会被加上一个this指针参数, 这是编译器自己加的.

举例说明:

class CIo
{
public:
    CIo();
    ~CIo();
    void ioStart();
    void Start();  //Q1:这是可以不用,直接在下面的函数里实现吗?
    static DWORD WINAPI start(void *arg);
private:
};
void CIo::Start()
{
    这个线程里面已经可以开始使用类的成员变量了
}
 
DWORD WINAPI CIo::start(void *arg)//返回值一定要这样写  WINAPI表示__stdcall,指被调用方去清理栈.
{
    CIo *io = (CIo *)arg;
    io->Start();      //Q2:这里不能够直接调用Start()吗?
    return 0;
}
 
 
void CIo::ioStart()  //如何把这个程序运行起来?
{
    HANDLE Handle;
    Handle = CreateThread(NULL, 0, start, this, 0, NULL); //这里的start函数需要为静态类型的
    CloseHandle(Handle);
}
 
————————————————
版权声明:本文为CSDN博主「GT19930910」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FlayHigherGT/article/details/83651281
新战场:https://blog.csdn.net/Stephen___Qin
原文地址:https://www.cnblogs.com/Stephen-Qin/p/11576558.html