6、一个 pthread_cancel 引起的线程死锁(转)
2013-01-17 14:11
141 查看
6、一个 pthread_cancel 引起的线程死锁【整理转载】
说明:本文由【2,3】整理而得。这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。
目 录:
1. 一个 pthread_cancel 引起的线程死锁小例子
2. 取消点(Cancellation Point)
3. 取消类型(Cancellation Type)
4. Linux 的取消点实现
5. 对示例函数进入死锁的解释
6. 如何避免因此产生的死锁
7. 结论
8. 参考文献
1. 一个 pthread_cancel 引起的线程死锁小例子
下面是一段在Linux 平台下能引起线程死锁的小例子。这个实例程序仅仅是使用了条件变量和互斥量进行一个简单的线程同步,thread0 首先启动,锁住互斥量 mutex,然后调用pthread_cond_wait,它将线程 tid[0] 放在等待条件的线程列表上后,对 mutex 解锁。thread1启动后等待 10 秒钟,此时 pthread_cond_wait 应该已经将 mutex 解锁,这时 tid[1] 线程锁住mutex,然后广播信号唤醒 cond 等待条件的所有等待线程,之后解锁 mutex。当 mutex 解锁后,tid[0] 线程的 pthread_cond_wait 函数重新锁住 mutex 并返回,最后 tid[0] 再对 mutex 进行解锁。
示例代码
View Code
View Code
View Code
View Code
void cleanup(void*arg) { pthread_mutex_unlock(&mutex); } void* thread0(void* arg) { pthread_cleanup_push(cleanup, NULL); // thread cleanup handler pthread_mutex_lock(&mutex); pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex); pthread_cleanup_pop(0); pthread_exit(NULL); }
这样,当线程被取消时,先执行 pthread_cond_wait 中注册的线程清理函数__condvar_cleanup,将 mutex 锁上,再执行 thread0 中注册的线程处理函数 cleanup,将mutex解锁。这样就避免了死锁的发生。
7. 结论
多线程下的线程同步一直是一个让人很头痛的问题。POSIX 为了避免立即取消程序引起的资源占用问题而引入的 Cancellation Points 概念是一个非常好的设计,但是不合适的使用pthread_cancel 仍然会引起线程同步的问题。了解POSIX 线程取消点在 Linux 下的实现更有助于理解它的机制和有利于更好的应用这个机制。
8. 参考文献
[1] W. Richard Stevens, Stephen A. Rago: Advanced Programming in the UNIX Environment, 2nd Edition.
[2] Linux Manpage
http://wzw19191.blog.163.com/blog/static/131135470200992610550684/
[3] http://hi.baidu.com/hackers365/blog/item/412d0f085c1fd18f0a7b8205.html
【4】 http://blog.csdn.net/yanook/article/details/6589798
相关文章推荐
- 一个 pthread_cancel 引起的线程死锁
- 一个 pthread_cancel 引起的线程死锁【整理转载】
- 6、一个 pthread_cancel 引起的线程死锁【整理转载】
- 一个 pthread_cancel 引起的线程死锁【整理转载】
- 6、一个 pthread_cancel 引起的线程死锁【整理转载】
- pthread_cancel引起线程死锁-linux
- pthread_cancel引起的死锁
- pthread_cancel,取消一个线程
- 优雅的cancel一个pthread线程
- pthread_cancel的带来的一个死锁问题(验证)
- 防止死锁:采用linux多线程的pthread_cancel终止线程
- 一个 pthread_cancel 引起的线程死锁
- pthread_cancel引起的死锁
- pthread_setcanceltype 线程取消
- 调用系统函数pthread_cancel取消进程的其他线程
- [java]一个多线程引起的死锁(class初始化,锁)
- pthread_cancel() 能结束哪些线程-linux
- 【转】用Pthread创建线程的一个简单Demo
- linux下pthread_cancel无法取消线程的原因
- 引起线程死锁的一种情况及解决方法