关于CreateThread()问题
我执行了CreateThread()创建一个线程,但是现在有一个非常奇怪的问题我多次打开关闭程序后总有机会导致我线程加锁死掉代码大体如下:CRITICAL_SECTION...
我执行了CreateThread()创建一个线程,但是现在有一个非常奇怪的问题
我多次打开关闭程序后总有机会导致我线程加锁死掉
代码大体如下:
CRITICAL_SECTION m_cs;
HANDLE m_hThread;
void Lock()
{
if ( m_hThread) EnterCriticalSection(&m_cs);
};
void UnLock()
{
if ( m_hThread) LeaveCriticalSection(&m_cs);
}
//创建线程
vodi Start()
{
m_hThread = ::CreateThread(...);
}
//线程处理函数
unsigned long Working() {
while (bWork)
{
Lock();
bWork = UpdateData();
UnLock();
}
}
调试时发现导致死锁是在“Lock()”,不知道为啥有的时候在执行Lock()的时候线程句柄m_hThread 会为NULL,但是线程肯定是创建成功的,因为我尝试在Lock的时候句柄为NULL则跳到下一次,则可以正常运行
现在就是不知道为什么明明线程创建成功了,但是第一次执行线程循环的时候句柄有几率为NULL,是不是在CreateThread(...)创建线程时需要执行sleep()函数??? 展开
我多次打开关闭程序后总有机会导致我线程加锁死掉
代码大体如下:
CRITICAL_SECTION m_cs;
HANDLE m_hThread;
void Lock()
{
if ( m_hThread) EnterCriticalSection(&m_cs);
};
void UnLock()
{
if ( m_hThread) LeaveCriticalSection(&m_cs);
}
//创建线程
vodi Start()
{
m_hThread = ::CreateThread(...);
}
//线程处理函数
unsigned long Working() {
while (bWork)
{
Lock();
bWork = UpdateData();
UnLock();
}
}
调试时发现导致死锁是在“Lock()”,不知道为啥有的时候在执行Lock()的时候线程句柄m_hThread 会为NULL,但是线程肯定是创建成功的,因为我尝试在Lock的时候句柄为NULL则跳到下一次,则可以正常运行
现在就是不知道为什么明明线程创建成功了,但是第一次执行线程循环的时候句柄有几率为NULL,是不是在CreateThread(...)创建线程时需要执行sleep()函数??? 展开
展开全部
CreateThread创建线程,此时线程开始运行,然后CreateThread返回线程句柄,如果新建的线程运行很快的话,第一次Lock时有可能CreateThread还没有返回,m_hThread也就还没有被赋值。
建议CreateThread时,使用CREATE_SUSPENDED标志先把线程挂起,然后再ResumeThread运行线程,这样可以保证线程运行时m_hThread已经被赋值
建议CreateThread时,使用CREATE_SUSPENDED标志先把线程挂起,然后再ResumeThread运行线程,这样可以保证线程运行时m_hThread已经被赋值
追问
谢谢你的回答,CREATE_SUSPENDED标志先把线程挂起后何时在开始运行线程?
直接sleep效果一样吗
追答
CreateThread之后,直接调用ResumeThread就行,因为此时线程句柄已经有值了。
我觉得用sleep不好,因为你不知道该sleep多长时间,时间太长影响性能,时间太短还是有风险。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询