afu

afu

0个粉丝

18

问答

0

专栏

3

资料

afu  发布于  2008-09-10 10:52:48
采纳率 0%
18个问答
13255

ExitThread() 函使用方法及例子

 
ExitThread() 函数:

功能: 提前结束一个线程

原型:  VOID ExitThread(DWORD dwExitCode)

参数: dwExitCode 线程的返回值

函数行为: 该函数最好用于 C 程序里,在 C++里调用该函数结束线程,并不会调用有关对象的析构函数以及其它的自动清理动作.当在线程里调用该函数后,线程的堆栈将被收回,所有未完成的I/O操作将被取消,于其连接的动态连接库也被分离.如果该线程是程序里的最后一个线程,则程序也随之结束.线程对象将发出一个信号,释放所有等待该线程结束的线程.一个线程结束了,并不需要释放与之相关的线程对象句柄,当与线程对象句柄相关的所有线程结束后,线程对象句柄将被删除.

以上是MSDN里的,有的没写了,主要问题是,候捷翻译书上说(Pg: 67)


" 这一线程的结束(不论是因为返回或因为调用了ExitThread())会使得程序中得所有线程都
被迫结束,程序也因此而结束,其它线程没有机会做清理工作."

而后面又说:


" 在主线程中调用ExitThread()也可以,那会导致线程结束而"worker线程"继续存在"

这前后矛盾的话相差就是几行文字,看了觉得不提出来心里就不爽,难到"所有线程"不能包括"worker线程"吗 ??? (注:worker线程是指与 UI 无关的纯计算线程)

下面的程序就否定了,在主线程里调用ExitThread()函数使得所有线程都被迫结束得观点:


#define WIN32_LEAN_AND_MEAN

#include
#include
#include
#include

DWORD WINAPI ThreadProc(LPVOID);
VOID TestFun();

DWORD WINAPI ThreadProc(LPVOID p){
for(;;)
  puts("In ThreadProc()");
return 100;
}

int main(){
HANDLE hThread;
DWORD dwThId;

hThread = CreateThread(NULL,0,ThreadProc,0,0,&dwThId);
if(hThread){
  puts("start thread");
  CloseHandle(hThread);
}
ExitThread(2);
assert(FALSE);

return EXIT_SUCCESS;
}
我来回答
回答1个
时间排序
认可量排序

aduadu

0个粉丝

101

问答

0

专栏

45

资料

aduadu 2008-09-13 19:11:56
认可0
这个不好。。。最好正常返回。用一个返回变量
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区