线程包装器实现问题
Thread wrapper implementation issue
我正在做一个围绕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;
}
它创建一个运行Run方法的线程,并将指针传递到此对象实例。原因是一旦线程执行了函数,它就会将状态设置为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;
}
这也是Detach(),它也在线程析构函数上调用:
void Thread::Detach()
{
mState = Thread::DETACHED;
mHandle = NULL;
mArg = NULL;
mFunctionPointer = NULL;
}
我觉得这一点都不安全。例如,如果Thread对象是在堆栈上构造的,并且在其线程运行时超出了作用域。线程对象析构函数NULL其状态和数据成员,但内存位置可能会被覆盖否?
有什么好办法解决这个问题吗?
感谢
如果Thread实例超出范围而之前没有连接线程,那么您就注定要失败。使Run()成为一个自由或静态函数,并复制所有数据,该函数需要运行到动态分配的内存中,并让Run()释放该内存。
Run()中不需要那么多测试。由于c'tor参数已经与CreateThread()兼容,只需将函数和参数传递给CreateThread,就可以了。
问候
Torsten
相关文章:
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在用于格式4的arm模拟器中实现功能时的一个问题
- C++头文件和类实现出现问题
- 类继承,ENUM 与 AST 类实现的问题
- std::max() 函数与定点实现的比较中的问题
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 在我的四叉树实现中遇到问题
- 涉及指针和手动实现的矩阵类的问题
- 有关邻接矩阵实现的问题
- 在 C++ 中实现简单链表时出现问题,没有输出
- 基于 SFINAE 的特征实现问题与函数模板重载
- MCS 锁定实现的问题
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 在我自己的堆栈中实现top的问题
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- C++中链表实现的问题
- c++在实现模板化嵌套类时遇到问题
- 简单的最大除数问题 c++ 实现抛出时间限制已超出
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- 虚拟 CTOR 的克隆函数实现是否有问题