多線程用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM