我稱之爲提到的Windows API。但它會返回與由_beginthreadex
返回的ID不同的線程ID。我的代碼如下,GetCurrentThreadId返回不同的線程ID
ThreadTest *_threadTest = new ThreadTest();
Thread *_thread = new Thread(StartRoutineForThread,_threadTest);
構造Thread類是,
ThreadWin::ThreadWin(void * (*_startRoutine)(void *), void * _argument, bool _isJoinable)
{
unsigned int _threadAddress;
unsigned int threadID = _beginthreadex(
NULL,
0,
(unsigned int (__stdcall *)(void *))_startRoutine,
_argument,
0,
&_threadAddress
);
}
StartRoutineForThread
函數,它是線程啓動程序之後,
void* StartRoutineForThread(void* _argument)
{
ThreadTest *_threadTest = (ThreadTest*)_argument;
_threadTest->Run();
return NULL;
}
void ThreadTest::Run()
{
this->threadID = ::GetCurrentThreadId();
}
現在,在類的構造函數Thread
變量threadID
的值與ThreadTest
的變量的值不同我從Run
函數中獲得。但是Run
函數是從我創建線程時指定的函數調用的。所以Run
函數在我創建的同一個線程下運行。但爲什麼GetCurrentThreadId()
返回的值與_beginthreadex
返回的值不同?
手柄和ID有什麼區別? – Tahlil
@kalkin句柄用於操作。 DC,GDI對象,線程,進程......如果你有這些句柄,你可以通過直接調用函數來操作它。 (例如,'HDC hdc = ...; TextOut(hdc,...);'因此,句柄不需要全局有效,只需要在一個有句柄的進程中有效。 ,id不能用於操作,它僅僅用於區分,它在全局上是有效和唯一的,甚至是進程間的,但是你不能用id來操作「對象(線程,進程,..)」,你應該有適當的訪問權限,並從ID('GetThreadId'函數... ...獲取句柄... – ikh
@kalkin有關id(尤其是線程ID)的更多信息,請參閱http://msdn.microsoft.com/en-us/library/windows /desktop/ms686746.aspx – ikh