我正在做一个围绕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