首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线程的撤销模式

2013-09-06 
线程的取消模式posix的线程有两中取消模式,立即取消和延迟取消.立即取消是你调用pthread_cancel的时候,不

线程的取消模式
posix的线程有两中取消模式,立即取消和延迟取消.
立即取消是你调用pthread_cancel的时候,不管线程当前正在干什么,马上被结束掉.
延迟取消是在你调用pthread_cancel以后,线程运行到一个取消点函数的时候才会结束.
使用pthread_join函数挂起当前线程后,想取消挂起,因此试着用了 pthread_detach函数,必须把pthread_detach放在pthread_join()前面.
如果没有设置detach就要join, 否则线程的一些资源不会释放。


立即取消:
在线程函数里增加这样两条语句    
  //收到cancel信号后设为cancle态    
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,   NULL);    
   
  //收到cancel信号后立即退出           
  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,   NULL);   
  或增加取消点
  pthread_testcancle();

pthread_detach()

创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于wait,waitpid)但是调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此,比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的链接),这时可以在子线程中加入代码pthread_detach(pthread_self())或者父线程调用pthread_detach(thread_id)(非阻塞,可立即返回)这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源 

 

热点排行