取消线程
(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`来实现定时器,以及`MyThreadTimer`的实现方式。 首先,理解`SetTimer`函数的基本用法。`SetTimer`的原型如下: ```cpp UINT_PTR SetTimer( _In_opt_ HWND hWnd, _In...
线程可以通过`Abort()`方法强制结束,但这种方法可能引发异常,建议使用协作方式,如设置取消标志来终止线程。 4. **线程优先级** C#允许设置线程优先级,但并不保证优先级高的线程一定先执行,因为调度策略由操作...
在IT行业中,线程是操作系统分配CPU执行时间的...通过上述知识点,"线程的各种使用方式Demo"可能涵盖了线程的创建、管理、同步、通信等多个方面,有助于开发者深入理解线程的使用,并在实际项目中高效地利用多线程。
本资源“C#.NET多线程实例6个”涵盖了多线程的基本使用以及更高级的概念,如线程互斥,这将帮助开发者深入理解并有效地应用多线程技术。 1. **多线程基本使用**:在C#中,创建和管理线程主要通过`System.Threading`...
通常,更安全的做法是通过设置共享标志(例如使用volatile关键字修饰的变量)来通知线程自行终止,或者在执行到某个已知点时检查取消标志。 在实际应用中,多线程操作需要谨慎处理,因为线程间的交互可能引发竞态...
- **联系**:定时器可以结合多线程使用,例如在工作者线程中设置定时器来定期执行某个任务,或者在用户界面线程中设置定时器来定期刷新界面。 #### 五、线程消息传递 在多线程环境中,线程间通信非常重要。MFC提供...
该指南将详细介绍POSIX线程编程的基本知识点,包括线程创建、线程间通信、线程取消、线程私有数据、线程同步、线程终止和杂项函数等内容。 线程与进程是操作系统中两种不同的执行流。进程是资源管理的基本单位,而...
- 创建线程后,需要管理它们的生命周期,可能包括等待、取消、终止等操作。 - 要处理线程可能遇到的异常和错误,比如找不到文件、权限问题、磁盘空间不足等。 7. **性能优化** - 虽然多线程可以加速搜索,但过多...
易语言提供了诸如`等待线程`、`唤醒线程`、`取消线程`等命令来协调线程之间的执行顺序。同时,还可以利用`互斥量`、`信号量`等同步机制确保共享资源的安全访问。 5. **控制线程数量**: 为了优化系统性能和避免...
它们在主线程中处理消息和回调,如果在工作线程中使用了Handler,记得在结束线程前关闭Looper,以防止内存泄漏和资源占用。 总结,结束Android线程时,关键在于优雅、安全地中断操作,而不是简单粗暴地停止。合理的...
pthread 库提供了丰富的 API 接口,包括线程创建、线程同步、线程取消等。 3. pthread_cancel 函数 pthread_cancel 函数是 pthread 库中的一种函数,用于取消一个线程的执行。该函数将发送一个取消请求给指定的...
线程取消 2.1 线程取消的定义 2.2 线程取消的语义 2.3 取消点 2.4 程序设计方面的考虑 2.5 与线程取消相关的pthread函数 3.线程私有数据 3.1概念及作用 3.2创建和注销 4.线程...
VB.NET 多线程控件的使用 BackgroundWorker 组件是 VS2005 和 VS2008 中添加的一个多线程编程控件,该控件使用起来非常方便,然而在开始时由于没有搞清楚它的使用机制,走了不少的弯路。下面是 BackgroundWorker 类...
委托可以使用`+=`操作符来订阅事件,`= null`来取消订阅,这样可以方便地管理事件处理函数。 结合线程和委托,我们可以在Web环境中实现定时执行某个方法。比如,可以定义一个委托类型,声明一个使用该委托类型的...
2. 线程的创建:pthread_create() 函数用于创建一个新线程,它的参数包括一个指向pthread_t型变量的指针(用来存储新线程的标识符)、指向线程属性对象的指针(通常传递NULL,使用默认属性)、一个返回类型为void*的...
《Posix_线程编程指南》这篇文档是一篇关于POSIX线程(简称pthread)编程的详细指南,涉及到多个方面的知识点,包括线程创建与管理、线程取消、线程私有数据、线程同步、线程终止等。以下将对这些知识点进行详细说明...
- **线程取消**:`CancellationToken`和`CancellationTokenSource`可以用来优雅地取消正在运行的线程。 5. **多线程中的死锁与活锁** - **死锁**:多个线程互相等待对方释放资源导致无法继续执行的状态。避免死锁...
在C#中,我们可以使用`System.Threading`命名空间中的`Thread`类来创建和控制线程。创建一个新的线程通常通过实例化`Thread`类并传递一个委托(或lambda表达式)作为参数,这个委托定义了新线程要执行的任务。例如:...
在QNX中,线程的取消可以使用pthread_cancel()函数,API定义如下: int pthread_cancel(pthread_t thread); 如果成功则返回0,否则为非0,成功并不意味着thread会终止,要视取消的状态和类型而定。 QNX还提供了...
在主线程中,当不再需要工作线程时,可以使用`quit()`或`terminate()`停止线程,但前者更安全,因为它会等待`run()`函数完成,后者则立即停止线程,可能造成数据不一致。线程结束后,应使用`wait()`确保线程完全关闭...