当前位置:  技术问答>linux和unix

pthread_cancel和pthread_cond_wait

    来源: 互联网  发布时间:2017-03-14

    本文导语:  一个线程阻塞在pthread_cond_wait上时,不配套使用[pthread_cleanup_push和pthread_cleanup_pop],例如: int wprior_rwlock_wrlock(wprior_rwlock_t *rw) {   int result = 0;   if (rw->rw_magic != RW_MAGIC)     return(EINVAL);   if ((result = pthread...

一个线程阻塞在pthread_cond_wait上时,不配套使用[pthread_cleanup_push和pthread_cleanup_pop],例如:


int wprior_rwlock_wrlock(wprior_rwlock_t *rw)
{
  int result = 0;

  if (rw->rw_magic != RW_MAGIC)
    return(EINVAL);

  if ((result = pthread_mutex_lock(&rw->rw_mutex)) != 0)
    return(result);

  while (rw->rw_refcount != 0) {
    rw->rw_nwaitwriters++;
    result = pthread_cond_wait(&rw->rw_condwriters, &rw->rw_mutex);
    rw->rw_nwaitwriters--;
    
    
    if (result != 0)
      break;
  }
  

  if (result == 0)
    rw->rw_refcount = -1;

  pthread_mutex_unlock(&rw->rw_mutex);
  return(result);
}


当这个线程被phread_cancel时,是不是这个线程只是暂停了,但是其实这个线程还存在的?

暂停是,从pthread_cond_wait返回,这个线程重新拥有mutex,然后就停住了,这个线程还是存在的。??



|
cancel是让线程退出,默认是延迟的,即非实时异步取消。

可以看得出楼主是在实现rwlock。

取消点是不可预料的,虽然APUE以及manpage里都会有所提及,但最佳的办法是在不希望被cancel的代码段主动pthread_setcancelstate设置为不可取消,在可取消段落恢复为可取消。

这里是条件变量和互斥锁的应用,所以最佳的强制退出办法是不依赖cancel(几乎没有什么应用是依赖pthread_cancel这种不靠谱的接口),自己定义标志变量,在while判断内加入检查。 如果希望所有阻塞在rwlock接口上的调用点全部失败返回,只需要lock,set flag,broacast,unlock即可,所有阻塞点都将被唤醒检查标志量后退出循环,释放锁并退出(这里你是退出循环,更普遍的应该是退出锁阻塞)。

当然,你也应该提供try_lock的rwlock接口,这是基本的。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • pthread_cancel()返回值为3,是什么原因?
  • 先pthread_cancel()再pthread_join(),主线程退出?
  • 关于pthread_cancel()之后的内存问题
  • 关于pthread_cancel的问题
  • pthread_cancel线程退出问题 while(1)这种循环如何退出?急!急 !
  • 大家帮忙看看这个pthread_cancel怎么没有起到作用?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3