我正在做一個圍繞win32線程和pthreads的包裝類,類似於C++ 11線程api的風格。 我的問題是關於在實際線程退出時更新線程對象實例。以下是我的解決方案,但我不確定它是否安全。線程包裝器實現問題
/* Thread wrapper class */
class Thread
{
public:
enum ThreadState
{
DETACHED = 0,
RUNNING
};
Thread();
Thread(void* (*start) (void*), void* arg);
~Thread();
Thread& operator=(Thread& other);
void Join();
int32_t SetPriority(int32_t priority);
void Detach();
ThreadHandle GetNativeHandle();
ThreadState GetThreadState();
private:
ThreadHandle mHandle;
ThreadState mState;
void* (*mFunctionPointer) (void*);
void* mArg;
static void* Run(void* arg);
ThreadHandle _CreateThread(void* (*start) (void*), void* arg);
void _JoinThread(ThreadHandle& handle);
};
第二個構造函數啓動一個線程。下面是執行:
Thread::Thread(void* (*start) (void*), void* arg)
{
mFunctionPointer = start;
mArg = arg;
mState = Thread::RUNNING;
mHandle = _CreateThread(&Run, (void*)this);
if (!mHandle)
mState = Thread::DETACHED;
}
它創建一個運行運行方式,沿着一個指向這個對象實例通過一個線程。原因是一旦線程執行了它將狀態設置爲DETACHED以表示完成的功能。
這裏是運行方法
void* Thread::Run(void* arg)
{
Thread* thread = static_cast<Thread*>(arg);
if (thread && thread->mFunctionPointer && thread->mArg && thread->mState == Thread::RUNNING)
thread->mFunctionPointer(thread->mArg);
if (thread && thread->mFunctionPointer && thread->mArg && thread->mState == Thread::RUNNING)
thread->Detach();
return NULL;
}
而且這是分離(),它也被稱爲上線的析構函數:
void Thread::Detach()
{
mState = Thread::DETACHED;
mHandle = NULL;
mArg = NULL;
mFunctionPointer = NULL;
}
我喜歡這種感覺是不是安全的。例如,如果線程對象在堆棧上構建並在其線程運行時超出範圍。 Thread對象析構函數將其狀態和數據成員設爲NULL,但內存位置可能會被覆蓋否?
有沒有解決這個問題的好辦法?
感謝
FYI,Boost.Thread(http://www.boost.org/doc/libs/release/doc/html/thread.html)是周圍的win32的包裝和並行線程。在最新版本的Boost(1.50)中,進行了更改,以便API與C++ 11的「std :: thead」相匹配。 – 2012-07-16 16:48:48