pthread_cancel和pthread_cond_wait

program2050 2012-09-12 05:44:45
一个线程阻塞在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,然后就停住了,这个线程还是存在的。??


...全文
191 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-09-12
  • 打赏
  • 举报
回复
cancel是让线程退出,默认是延迟的,即非实时异步取消。

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

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

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

当然,你也应该提供try_lock的rwlock接口,这是基本的。
program2050 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

man pthread_cancel过了,怎么会不知道他是用来结束线程的呢? 至少也百度/GOOGLE后再问吧。
[/Quote]

好吧。向传说中的大牛鞠躬了。


自己写个test,已经知道,为什么pthread_cancel后,mutex还锁住了。必须pthread_cleanup_push()。
fdl19881 2012-09-12
  • 打赏
  • 举报
回复
man pthread_cancel过了,怎么会不知道他是用来结束线程的呢? 至少也百度/GOOGLE后再问吧。
program2050 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

man pthread_cancel
[/Quote]

你这不废话吗,我要是理解了,我还来问什么。。。
fdl19881 2012-09-12
  • 打赏
  • 举报
回复
man pthread_cancel

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧