进程中只有一个线程

xinustc 2008-12-08 03:59:46
刚刚接触windows编程,对进程和线程不是很了解

这是windows核心编程的一段代码:创建了一个进程,如果成功马上把线程关闭,再执行下面操作。
我不太明白,创建的进程应该只有一个线程吧,为什么要关闭?我看到一个说法是:进程都是通过
线程来执行操作的。那么干吗要关闭线程呢?


PROCESS_INFORMATION pi;
DWORD dwExitCode;
// Spawn the child process.
BOOL fSuccess = CreateProcess(..., &pi);
if (fSuccess) {
// Close the thread handle as soon as it is no longer needed!
CloseHandle(pi.hThread);
// Suspend our execution until the child has terminated.
WaitForSingleObject(pi.hProcess, INFINITE);
// The child process terminated; get its exit code.
GetExitCodeProcess(pi.hProcess, &dwExitCode);
// Close the process handle as soon as it is no longer needed.
CloseHandle(pi.hProcess);
}
...全文
86 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
riseforest 2008-12-08
可以理解为断开联系,但不一定是子进程,只要是内核对象都可以关闭
回复
yaozhu88 2008-12-08
1,建立一个进程时,它会建立一个进程内核对象和一个线程内核对象,并且此时内核对象计数都为2.你CloseHandle(pi.hThread);时只是减少一个线程内核对象的计数而已,变为1.不会影响到这个线程的执行,你的这个线程执行玩了的话,它也会减少此线程内核对象的计数变为0.此时线程内核对象也会挂了。就不会泄露内存啦。

2,断开父进程与子进程的联系也是对的,explorer进程创建子进程的确也是这样做的。
回复
路人乙2019 2008-12-08
进程只有一个主线程,但可以有多个子线程。子线程都用createthread或_beginthread等函数创建,当然要关闭。但主线程是不需要创建地。
回复
xinustc 2008-12-08
稍稍懂了 这里只是父进程断开与子进程的联系的一个过程 这样理解对吗?
回复
wocow3 2008-12-08
CloseHandle并不是关闭线程进程,只是告诉kernel,这个句柄在当前进程中已经不再需要,通知kernel
CloseHandle只是做些清理工作,比如内核可能会对hThread引用计数--
也就是说,你的线程还在运行(CloseHandle(pi.hThread);)
回复
riseforest 2008-12-08
创建的进程不一定只有一个线程,也可能是多线程的
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-12-08 03:59
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……