对一段程序的疑惑

cxjxue 2003-04-23 11:22:17
HANDLE eventhandle;
HANDLE ThreadHandle;
int main()
{
eventhangle=CreateEvent(NULL,true, false, NULL);
startinstance();
stopinstance();
}

void startinstance()
{
ThreadHandle = ::CreateThread(...);//开启一个线程;线程函数为FnThread
...
}

void stopinstance()
{
DWORD lpExitCode;

WaitForSingleObject(eventhandle,INFINITE);
GetExitCodeThread(ThreadHandle,&lpExitCode);
TerminateThread(ThreadHandle,lpExitCode);
}

DWORD WINAPI FnThread(LPVOID pParam)
{
while(1)
{
对一个文件操作;操作完后break;
}

SetEvent(eventhandle);
return 1;
}

困惑是当线程操作完的时候返回1,线程是否已经退出来了?
那-在stopinstance函数里的这些语句起什么作用呢?让线程自己结束不是更好吗?

...全文
30 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyx 2003-04-23
  • 打赏
  • 举报
回复
TerminateThread(ThreadHandle,lpExitCode) 多余!
jianliang79 2003-04-23
  • 打赏
  • 举报
回复
这种方法不安全,因为SetEvent(eventhandle)执行后,执行stopinstance的那个线程就从阻塞态进入到就绪态,而万一这时候调度器将执行线程切换到执行stopinstance的线程,GetExitCodeThread取得的就不是你想要得1。应改为:

WaitForSingleObject(ThreadHandle,INFINITE);
GetExitCodeThread(ThreadHandle,&lpExitCode);
CloseHandle(ThreadHandle);
另外,eventhandle纯属多余,根本不需要,因为线程的句柄本身也可以作为同步对象,当他还在运行时为nonsignal状态,一旦结束就变为signal状态。
jiadrun 2003-04-23
  • 打赏
  • 举报
回复

WaitForSingleObject(eventhandle,INFINITE);若eventhandle线程没有结束,它会将主线程挂起,等待文件操作完成后才往下执行。GetExitCodeThread(ThreadHandle,&lpExitCode);
TerminateThread(ThreadHandle,lpExitCode);没有作用。

困惑是当线程操作完的时候返回1时,些线程已经释放。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧