当前位置: 技术问答>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],例如:
当这个线程被phread_cancel时,是不是这个线程只是暂停了,但是其实这个线程还存在的?
暂停是,从pthread_cond_wait返回,这个线程重新拥有mutex,然后就停住了,这个线程还是存在的。??
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接口,这是基本的。
可以看得出楼主是在实现rwlock。
取消点是不可预料的,虽然APUE以及manpage里都会有所提及,但最佳的办法是在不希望被cancel的代码段主动pthread_setcancelstate设置为不可取消,在可取消段落恢复为可取消。
这里是条件变量和互斥锁的应用,所以最佳的强制退出办法是不依赖cancel(几乎没有什么应用是依赖pthread_cancel这种不靠谱的接口),自己定义标志变量,在while判断内加入检查。 如果希望所有阻塞在rwlock接口上的调用点全部失败返回,只需要lock,set flag,broacast,unlock即可,所有阻塞点都将被唤醒检查标志量后退出循环,释放锁并退出(这里你是退出循环,更普遍的应该是退出锁阻塞)。
当然,你也应该提供try_lock的rwlock接口,这是基本的。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。