|
![]() | 作者: 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] ![]() |
登录 |
![]() 我就是那么做的 我循环内部是一个阻塞的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号