整理自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