2014-03-24 32 views
0

我稱之爲提到的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返回的值不同?

回答

6

那麼,_beginthreadex不會返回線程ID。線程標識存儲在_threadAddress中,最後一個參數_beginthreadex。它的返回值是線程句柄(類似CreateThread),不是id。

+0

手柄和ID有什麼區別? – Tahlil

+1

@kalkin句柄用於操作。 DC,GDI對象,線程,進程......如果你有這些句柄,你可以通過直接調用函數來操作它。 (例如,'HDC hdc = ...; TextOut(hdc,...);'因此,句柄不需要全局有效,只需要在一個有句柄的進程中有效。 ,id不能用於操作,它僅僅用於區分,它在全局上是有效和唯一的,甚至是進程間的,但是你不能用id來操作「對象(線程,進程,..)」,你應該有適當的訪問權限,並從ID('GetThreadId'函數... ...獲取句柄... – ikh

+0

@kalkin有關id(尤其是線程ID)的更多信息,請參閱http://msdn.microsoft.com/en-us/library/windows /desktop/ms686746.aspx – ikh

2

根據MSDN,_beginthreadex返回線程句柄,它與線程ID不一樣。

相關問題