`
shaojiashuai123456
  • 浏览: 262173 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

线程取消的使用

 
阅读更多

取消线程 

   (1)一个线程可以调用pthread_cancel来取消另一个线程。
   (2)被取消的线程需要被join来释放资源。
   (3)被取消的线程的返回值为PTHREAD_CANCELED
 

    有关线程的取消,一个线程可以为如下三个状态: 
         (1)可异步取消:一个线程可以在任何时刻被取消。 
         (2)可同步取消:取消的请求被放在队列中,直到线程到达某个点,才被取消。
         (3)不可取消:取消的请求被忽略。
           默认状态下,线程是可同步取消的。


     调用pthread_setcanceltype来设定线程取消的方式: 
               pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); //异步取消、 
               pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, NULL); //同步取消、
               pthread_setcanceltype (PTHREAD_CANCEL_DISABLE, NULL);//不能取消

 

取消的应用: 

     一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。
     最经常出现的情形是资源独占锁的使用:线程为了访问临界资源而为其加上锁,但在访问过程中被外界取消,如果线程处于响应取消状态,且采用异步方式响应,或者在打开独占锁以前的运行路径上存在取消点,则该临界资源将永远处于锁定状态得不到释放。外界取消操作是不可预见的,因此的确需要一个机制来简化用于资源释放的编程。

pthread_cleanup_push(pthread_mutex_unlock, (void *)&mut); 
pthread_mutex_lock(&mut); 
/* do some work */ 
pthread_mutex_unloc(&mut); 
pthread_cleanup_pop(0); 

 

    必须要注意的是,如果线程处PTHREAD_CANCEL_ASYNCHRONOUS状态,上述代码段就有可能出错,因为CANCEL事件有可能在pthread_cleanup_push()和pthread_mutex_lock()之间发生,或者在pthread_mutex_unlock()和pthread_cleanup_pop()之间发生,从而导致清理函数unlock一个并没有加锁的 mutex变量,造成错误。因此,在使用清理函数的时候,都应该暂时设置成PTHREAD_CANCEL_DEFERRED模式。为此,POSIX的Linux实现中还提供了一对不保证可移植的pthread_cleanup_push_defer_np()/pthread_cleanup_pop_defer_np()扩展函数,功能与以下代码段相当:

 

{ 
   int oldtype; 
   pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); //设置为同步取消,这样保证push和其他操作不能被打断 
  pthread_cleanup_push(routine, arg); 
  ... 
   pthread_cleanup_pop(execute); 
   pthread_setcanceltype(oldtype, NULL); 
} 

 


资料来自:http://linux.die.net/man/3/pthread_setcanceltype

               http://blog.csdn.net/caianye/article/details/5912172

               http://www.cnblogs.com/forfuture1978/archive/2010/4/27.html

 

分享到:
评论

相关推荐

    线程内使用SetTimer实现定时器

    本篇将详细讲解如何在线程内部使用`SetTimer`来实现定时器,以及`MyThreadTimer`的实现方式。 首先,理解`SetTimer`函数的基本用法。`SetTimer`的原型如下: ```cpp UINT_PTR SetTimer( _In_opt_ HWND hWnd, _In...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)

    线程可以通过`Abort()`方法强制结束,但这种方法可能引发异常,建议使用协作方式,如设置取消标志来终止线程。 4. **线程优先级** C#允许设置线程优先级,但并不保证优先级高的线程一定先执行,因为调度策略由操作...

    线程的各种使用方式Demo

    在IT行业中,线程是操作系统分配CPU执行时间的...通过上述知识点,"线程的各种使用方式Demo"可能涵盖了线程的创建、管理、同步、通信等多个方面,有助于开发者深入理解线程的使用,并在实际项目中高效地利用多线程。

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)_26.rar

    本资源“C#.NET多线程实例6个”涵盖了多线程的基本使用以及更高级的概念,如线程互斥,这将帮助开发者深入理解并有效地应用多线程技术。 1. **多线程基本使用**:在C#中,创建和管理线程主要通过`System.Threading`...

    C# 如何挂起线程、休眠线程和终止线程(源码例)

    通常,更安全的做法是通过设置共享标志(例如使用volatile关键字修饰的变量)来通知线程自行终止,或者在执行到某个已知点时检查取消标志。 在实际应用中,多线程操作需要谨慎处理,因为线程间的交互可能引发竞态...

    MFC多线程的创建,包括工作线程和用户界面线程

    - **联系**:定时器可以结合多线程使用,例如在工作者线程中设置定时器来定期执行某个任务,或者在用户界面线程中设置定时器来定期刷新界面。 #### 五、线程消息传递 在多线程环境中,线程间通信非常重要。MFC提供...

    Posix线程编程指南

    该指南将详细介绍POSIX线程编程的基本知识点,包括线程创建、线程间通信、线程取消、线程私有数据、线程同步、线程终止和杂项函数等内容。 线程与进程是操作系统中两种不同的执行流。进程是资源管理的基本单位,而...

    使用多线程进行文件搜索

    - 创建线程后,需要管理它们的生命周期,可能包括等待、取消、终止等操作。 - 要处理线程可能遇到的异常和错误,比如找不到文件、权限问题、磁盘空间不足等。 7. **性能优化** - 虽然多线程可以加速搜索,但过多...

    易语言多线程控制线程数量源码

    易语言提供了诸如`等待线程`、`唤醒线程`、`取消线程`等命令来协调线程之间的执行顺序。同时,还可以利用`互斥量`、`信号量`等同步机制确保共享资源的安全访问。 5. **控制线程数量**: 为了优化系统性能和避免...

    Android线程结束——合理的结束你想结束的线程

    它们在主线程中处理消息和回调,如果在工作线程中使用了Handler,记得在结束线程前关闭Looper,以防止内存泄漏和资源占用。 总结,结束Android线程时,关键在于优雅、安全地中断操作,而不是简单粗暴地停止。合理的...

    Linux取消线程实例代码.pdf

    pthread 库提供了丰富的 API 接口,包括线程创建、线程同步、线程取消等。 3. pthread_cancel 函数 pthread_cancel 函数是 pthread 库中的一种函数,用于取消一个线程的执行。该函数将发送一个取消请求给指定的...

    Posix线程编程指南.rar

    线程取消 2.1 线程取消的定义 2.2 线程取消的语义 2.3 取消点 2.4 程序设计方面的考虑 2.5 与线程取消相关的pthread函数 3.线程私有数据 3.1概念及作用 3.2创建和注销 4.线程...

    VB.NET多线程控件的使用

    VB.NET 多线程控件的使用 BackgroundWorker 组件是 VS2005 和 VS2008 中添加的一个多线程编程控件,该控件使用起来非常方便,然而在开始时由于没有搞清楚它的使用机制,走了不少的弯路。下面是 BackgroundWorker 类...

    WebDelegate_线程(在Web中使用线程+委托)

    委托可以使用`+=`操作符来订阅事件,`= null`来取消订阅,这样可以方便地管理事件处理函数。 结合线程和委托,我们可以在Web环境中实现定时执行某个方法。比如,可以定义一个委托类型,声明一个使用该委托类型的...

    linux多线程编程.pdf

    2. 线程的创建:pthread_create() 函数用于创建一个新线程,它的参数包括一个指向pthread_t型变量的指针(用来存储新线程的标识符)、指向线程属性对象的指针(通常传递NULL,使用默认属性)、一个返回类型为void*的...

    Posix_线程编程指南

    《Posix_线程编程指南》这篇文档是一篇关于POSIX线程(简称pthread)编程的详细指南,涉及到多个方面的知识点,包括线程创建与管理、线程取消、线程私有数据、线程同步、线程终止等。以下将对这些知识点进行详细说明...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例).rar

    - **线程取消**:`CancellationToken`和`CancellationTokenSource`可以用来优雅地取消正在运行的线程。 5. **多线程中的死锁与活锁** - **死锁**:多个线程互相等待对方释放资源导致无法继续执行的状态。避免死锁...

    C#多线程进度条实例

    在C#中,我们可以使用`System.Threading`命名空间中的`Thread`类来创建和控制线程。创建一个新的线程通常通过实例化`Thread`类并传递一个委托(或lambda表达式)作为参数,这个委托定义了新线程要执行的任务。例如:...

    QNX环境下多线程编程

    在QNX中,线程的取消可以使用pthread_cancel()函数,API定义如下: int pthread_cancel(pthread_t thread); 如果成功则返回0,否则为非0,成功并不意味着thread会终止,要视取消的状态和类型而定。 QNX还提供了...

    在Qt(C++)中使用QThread实现多线程 - 星夜之夏 - 博客园1

    在主线程中,当不再需要工作线程时,可以使用`quit()`或`terminate()`停止线程,但前者更安全,因为它会等待`run()`函数完成,后者则立即停止线程,可能造成数据不一致。线程结束后,应使用`wait()`确保线程完全关闭...

Global site tag (gtag.js) - Google Analytics