pthread_cond_wait时pthread_cancel的线程清理

简介:

A  condition  wait  (whether  timed  or  not)  is  a  cancellation  point. 
When the cancelability type of a thread is set to PTHREAD_CAN_CEL_DEFERRED, a side-effect of acting upon a cancellation request while in a condition wait is that the mutex is (in effect)  re-acquired before  calling the first cancellation cleanup handler. The effect is as if the thread were unblocked, allowed to execute up to the point of returning from the call to pthread_cond_timedwait() or pthread_cond_wait(), but at that point notices  the  cancellation  request  and instead  of  returning to the caller of pthread_cond_timedwait() or pthread_cond_wait(), starts the thread cancellation activities, which includes calling cancellation cleanup handlers.

意思就是在pthread_cond_wait时执行pthread_cancel后,要先在pthread_cleanup handler时要先解锁已与相应条件变量绑定的mutex。这样是为了保证pthread_cond_wait可以返回到调用线程。

测试代码:(试一下把cleanup中的pthread_mutex_unlock(&mutex)注释掉可以发现清理时的问题,不注释掉就是正常的清理)

源代码不知道怎么格式了,以纯文本粘贴了



#include <iostream>
#include <pthread.h>

using namespace std;
pthread_mutex_t mutext;
pthread_cond_t cond;

void cleanup(void *arg)
{
    cout<<"cleanup"<<endl;
    pthread_mutex_unlock(&mutext);
}

void* ThreadTest(void* para){
    pthread_cleanup_push(cleanup, NULL);

    pthread_mutex_lock(&mutext);
    pthread_cond_wait(&cond, &mutext);
    pthread_mutex_unlock(&mutext);

    cout<<"test"<<endl;

    pthread_cleanup_pop(0);
}

int main() {
    pthread_mutex_init(&mutext, NULL);

    pthread_t thread1,thread2;
    pthread_create(&thread1,NULL,ThreadTest,NULL);
    pthread_create(&thread2,NULL,ThreadTest,NULL);

    pthread_cancel(thread1);
    pthread_cancel(thread2);
    
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);

    return 0 ;
}










本文转自 hakuyo 51CTO博客,原文链接:http://blog.51cto.com/hakuyo/1596509,如需转载请自行联系原作者

目录
相关文章
|
物联网 Linux 开发者
线程 pthread_exit 时执行清理程序|学习笔记
快速学习线程 pthread_exit 时执行清理程序
线程 pthread_exit 时执行清理程序|学习笔记
|
物联网 Linux 开发者
线程被取消的时候执行清理函数|学习笔记
快速学习线程被取消的时候执行清理函数
线程被取消的时候执行清理函数|学习笔记
|
物联网 Linux 开发者
注册线程清理函数|学习笔记
快速学习注册线程清理函数
|
物联网 Linux 开发者
Pthread_cancel 线程取消|学习笔记
快速学习 Pthread_cancel 线程取消
|
物联网 Linux 开发者
注册线程清理函数|学习笔记
快速学习注册线程清理函数
|
Linux
Linux系统编程-(pthread)线程的使用案例(分离属性、清理函数等)
这篇文章介绍Linux下线程的创建与基本使用案例,主要是案例代码为主;相关的函数详细介绍在上篇文章里已经介绍过了。
213 0
下一篇
无影云桌面