当前位置: 代码迷 >> 多核软件开发 >> 请大侠帮助解决线程同步有关问题
  详细解决方案

请大侠帮助解决线程同步有关问题

热度:2787   发布时间:2013-02-26 00:00:00.0
请大侠帮助解决线程同步问题
我有2个按钮,一个是run,一个是stop。
run按钮响应函数,创建一个子线程1.
m_pBExpThread=AfxBeginThread(BExpThreadFunc, &g_bexpthreadparams);

线程处理函数
while(0==m_stopflag))
{
...
}
ReleaseSemaphore(m_threadmutex, 1, NULL);

stop按钮想让子线程1安全退出后,再执行一些操作,用信号来同步互斥。
stop响应函数
m_stopflag=1;
WaitForSingleObject(m_threadmutex, INFINITE);


调试结果点击stop后,挂死在WaitForSingleObject.

threadmutex初始化为0,只有这2个地方操作这个信号,请大侠帮忙看看这个问题如何解决,非常感谢

------解决方案--------------------------------------------------------
跟踪下确定ReleaseSemaphore执行到了没有。
不过一般你应该wait的是CreateThread返回的HANDLE.用Afx的话是m_hThread
------解决方案--------------------------------------------------------
使用事件进行线程同步程同步 
 
CEvent类是一个事件类,刚定义时处于"非信号"状态, 可以调用SetEvent()成员函数置它为"信号"状态.
下面的代码: 线程首先等待开始信号, 如果没有置开始信号会一直挂起等待, 同时在运行的过程中等待结束信号, 
如果结束信号发生就终止线程.
CEvent g_eventStart,g_eventKill;
UINT ThreadProc(LPVOID pParam)
{
//INFINITE表示等待无限时间
::WaitForSingleObject(g_eventtart,INFINITE); 
for (………)
{
……….
If(::WaitForSingleObject(g_eventKill,0)==WAIT_OBJECT_0))
Break;
}
return 0;
}
当启动线程时: g_eventStart.SetEvent();
当终止线程时: g_eventKill.SetEvent();
但在终止线程时如果还没有启动线程,则应该先启动线程再终止它.
注意: 线程如果不正常终止会引起内存泄漏, 例如用关闭进程的方法来强制终止线程,或使用Win32 
TerminateThread函数.
 

------解决方案--------------------------------------------------------
你不需要用这个信号量,wait线程结束就可以了。
你用也可以,但是要Release才行啊!while循环出不来,线程就不会结束,不release,wait正该继续等待。
检查下为什么循环出不来。
------解决方案--------------------------------------------------------
显然的,你的sem初始就没有信号,你线程函数里的ReleaseSemaphore根本就无效,到button2的waitforsingleobject的时候仍然没有signaled,所以就无线挂起
应该把sem初始为signaled,然后在线程函数里wait这个sem,当wait成功以后sem自动处于非触发状态了,之后再次ReleaseSemaphore才有效
  相关解决方案