论坛: 编程破解 标题: 关于线程取消点的问题 复制本贴地址    
作者: kert_t8 [kert_t8]    论坛用户   登录
有这么一个程序

...
while(1) {
....

pthread_testcancel();
}
/* close/free */
close(sock_fd);
free(int_ptr);
return 0;

这样设置取消点是正确的么?如果是正确的,程序是怎么运行到后面close/free那一段程序的呢?如果不正确,那么在这种while()循环里头应该怎么设置取消点才是正确的呢?

地主 发表时间: 06-09-30 10:47

回复: kert_t8 [kert_t8]   论坛用户   登录
另外,通过取消点退出的线程是否会自动释放创建进程所分配的资源?

B1层 发表时间: 06-09-30 10:51

回复: SysHu0teR [syshunter]   版主   登录
我发现程序永远不会运行到close free...那里去,不管在子线程里设置PTHREAD_CANCEL_DEFERRED还是PTHREAD_CANCEL_ASYCHRONOUS,main里只要一pthread_cancel(ptd),ptd线程马上就玩完了。文章上说pthread_testcancel好象只是为了让某些本不是取消点的阻塞函数变成取消点,如果这么说的话,那完整的意思不知道是不是:pthread_testcancel的用处就是让程序阻塞在某个阻塞函数时可以正常被cancel,除此以外,处处都是取消点

要是问题解决了记得回帖。

B2层 发表时间: 06-10-01 17:23

回复: kert_t8 [kert_t8]   论坛用户   登录
问题解决了
但是不是用pthread_cancel

我使用一个全局的变量,如果测试为真就 break; 

还是想知道大家都是怎么用的

B3层 发表时间: 06-10-03 20:41

回复: kert_t8 [kert_t8]   论坛用户   登录
syshunter,如果你是用我上面给的那个程序测得,那么不会执行close/free的语句是因为执行pthread_testcancel就相当于return了。如果pthread_testcancel放在while()外面又永远不可能执行到pthread_testcancel(),所以这就是一个矛盾。

其实感觉这种testcancel的方法跟我的方法差不多,就是在测试点测试是不是有线程调用pthread_cancel()来cancel这个线程了,如果没有就往下执行,有就直接退出了,这样使得程序员可以控制线程结束的位置,比较安全

还在继续研究这个pthread_testcancel.....

B4层 发表时间: 06-10-08 11:12

回复: 286 [unique]   版主   登录
...
while(1) {
....

pthread_testcancel();//此处用这个也可以,最简单的方法,你设成变量,在此处判断这个变量也可以。另外线程改变变量,此处跳出循环。
Sleep(1000);  //加入这一句的原因是可以每转一下就把控制权给操作系统,让他做别的,否则的话,你的程序占CPU使用率达近100%,别的程序很难得到机会。如果你的程序有个界面,这个界面会象死了一样,连刷新也来不及。
}
/* close/free */
close(sock_fd);
free(int_ptr);
return 0;

B5层 发表时间: 06-10-10 16:36

回复: kert_t8 [kert_t8]   论坛用户   登录
谢谢286

我就是那么做的
我循环内部是一个阻塞的recv(),带timeout,跟sleep也是差不多的

再请教下286,你们实际工程当中线程退出也是设置自己的变量么?还是通过系统提供的什么方法?

B6层 发表时间: 06-10-11 10:43

回复: 286 [unique]   版主   登录
这要看具体问题了,有时用互斥变量,有些甚至要用互斥区。
但一般情况下,用户的计算机都是单CPU,即使双CPU内存也是互斥访问(硬件实现的),所以用变量也不会出问题。

B7层 发表时间: 06-10-11 15:16

回复: kert_t8 [kert_t8]   论坛用户   登录
嗯~~~~~有道理

谢谢,谢谢

B8层 发表时间: 06-10-11 15:39

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号