linux程序设计——取消一个线程(第十二章)

原创 2015年07月07日 10:16:14

12.7    取消一个线程

有时,想让一个线程可以要求另一个线程终止,就像给它发送一个信号一样。线程有方法可以做到这一点,与与信号处理一样,线程可以被要求终止时改变其行为。
pthread_cancel是用于请求一个线程终止的函数
#inlude <pthread.h>
int pthread_cancel(pthread_t thread);
这个函数提供一个线程标识符就可以发送请求来取消它。
线程可以用pthread_setcancelstate设置线程的取消状态
#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
第一个参数的取值可以是PTHREAD_CANCEL_ENABLE,这个值允许线程接收取消请求;或者是PTHREAD_CANCEL_DISABLE,它的作用是忽略取消请求。oldstate指针用于获取先前的取消状态。
如果取消请求被接受了,线程就可以进入第二个控制层次,用pthread_setcanceltype设置取消类型
#include <pthread.h>
int pthread_setcanceltype(int type, int *oldtype);
type参数可以有两种取值:一个是PTHREAD_CANCEL_ASYNCHRONOUR,它将使得在接收到取消请求后立即采取行动;另一个是PTHREAD_CANCEL_DEFERRED,它将使得在接受到取消请求后,一直等待直到线程执行下述函数之一才采取行动。具体是函数pthread_join,pthread_cond_wait,pthread_cond_timedwait,pthread_testcancel,sem_wait或sigwait.
编写程序thread7.c,主线程向它创建的线程发送一个取消请求。
/*************************************************************************
 > File Name:    thread7.c
 > Description:  thread7.c程序在主线程中向它创建的新线程发送一个取消请求
 > Author:       Liubingbing
 > Created Time: 2015/7/7 9:58:40
 > Other:        thread7.c程序中新线程的调用函数中分别需要设置新线程的取消状态和取消类型
 ************************************************************************/

#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

void *thread_function(void *arg);

int main(){
	int res;
	pthread_t a_thread;
	void *thread_result;
	/* pthread_create函数创建新线程,新线程标识符保存在a_thread,新线程调用的函数为thread_function,函数的参数为NULL */
	res = pthread_create(&a_thread, NULL, thread_function, NULL);
	if (res != 0) {
		perror("Thread creation failed");
		exit(EXIT_FAILURE);
	}

	sleep(3);
	printf("Canceling thread...\n");
	/* pthread_cancel函数请求线程a_thread终止 */
	res = pthread_cancel(a_thread);
	if (res != 0) {
		perror("Thread cancelation failed");
		exit(EXIT_FAILURE);
	}
	printf("Waiting for thread to finish...\n");
	/* pthread_join等待线程a_thread与主线程重新合并 */
	res = pthread_join(a_thread, &thread_result);
	if (res != 0) {
		perror("Thread join failed");
		exit(EXIT_FAILURE);
	}
	exit(EXIT_SUCCESS);
}

void *thread_function(void *arg) {
	int i, res;
	/* pthread_setcancelstate函数设置线程的取消状态,PTHREAD_CANCEL_ENABLE允许线程接收取消请求;PTHREAD_CANCEL_DISABLE忽略取消请求 */
	res = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	if (res != 0) {
		perror("Thread pthread_setcancelstate failed");
		exit(EXIT_FAILURE);
	}
	/* pthread_setcanceltype函数设置线程的取消类型,PTHREAD_CANCEL_DEFERRED将使得在接收到取消请求后,一直等待直到线程执行某个函数(如pthread_join)之后才采取行动 */
	res = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
	if (res != 0) {
		perror("Thread pthread_setcanceltype failed");
		exit(EXIT_FAILURE);
	}
	printf("thread_function is running\n");
	for (i = 0; i < 10; i++){
		printf("Thread is still running (%d)...\n", i);
		sleep(1);
	}
	pthread_exit(0);
}
以通常的方法创建新线程后,主线程休眠一会儿(好让新线程有时间开始执行),然后发送一个取消请求,如下所示:
sleep(3);
printf("Canceling thread...\n");
res = pthread_cancel(a_thread);
在新创建的线程中,首先将取消状态设置为允许取消,如下所示:
res = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
然后将取消类型设置为延迟取消,如下所示:
res = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
最后,线程在循环中等待被取消,如下所示:
for (i = 0; i < 10; i++) {
    printf("Thread is still running (%d)...\n", i);
    sleep(1);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十二章 预处理程序

Part 1. #define语句 #define语句的基本用途之一是给符号名称指定程序常量。类似于文本编辑器中的搜索和替换。 优点记忆成本低:不必特意记住常量的值 更改便携性:只需在一个地方更改常量...
  • apple890111
  • apple890111
  • 2015年07月07日 15:24
  • 541

Objective-C 程序设计 第十二章

预处理程序预处理程序语句使用#开头,一行中的第一个非空字符。 大部分内容都与C语言类似,相当于复习啦。 12.1 #define语句 - 宏 预定义不是变量。不能为它赋值。实际上是字符的简单替换。...
  • Xiemx
  • Xiemx
  • 2015年11月12日 23:33
  • 367

多线程编程之线程取消

关键: pthread_cancel函数发送终止信号 pthread_setcancelstate函数设置终止方式 pthread_testcancel函数取消线程(另一功能是:设置取消点) ...
  • Hero06206
  • Hero06206
  • 2012年03月13日 22:10
  • 5873

Linux--多线程之线程的取消pthread_cancel

#include "apue.h" /** pthread_cancel(pthread_t tid) 取消tid指定的线程 成功返回0 取消只是发送一个请求 会不正常的终止线程 pthread_...
  • u011266694
  • u011266694
  • 2016年12月03日 19:43
  • 685

java程序设计基础_陈国君版第五版_第十一章习题

java程序设计基础_陈国君版第五版_第十一章习题 /** * 题目:假设某家银行可接受顾客的汇款,每进行一次汇款,便可计算出汇款的总额。现有两名顾客,每人分三次,每次一百元将钱汇入。试编程来模拟...
  • gaoenbin626
  • gaoenbin626
  • 2016年03月14日 10:03
  • 2275

linux程序设计——第一个线程程序(第十二章)

第12章    POSIX线程 在第11章中,介绍了如何在linux中处理进程.但有时人们认为,用fork调用来创建新进程的代价太高.在这种情况下,如果能让一个进程同时做两件事情或者至少看起来是这样会...
  • yiranant
  • yiranant
  • 2015年07月05日 11:12
  • 551

linux程序设计——同时执行的线程(第十二章)

12.4    同时执行 接下来编写一个程序来验证两个线程的执行是同时执行的(当然,如果是在一个单处理器系统上,线程的同时执行就需要靠CPU在线程之间的快速切换来实现).这个程序中,在两个线程之间使用...
  • yiranant
  • yiranant
  • 2015年07月05日 13:57
  • 467

Linux程序设计学习笔记----多线程编程基础概念与基本操作

转载请注明出处,谢谢.
  • hu1020935219
  • hu1020935219
  • 2014年08月14日 14:22
  • 1958

linux程序设计——线程的属性(第十二章)

12.6    线程的属性 在前面的所有程序示例中,都在程序退出之前用pthread_join对线程再次进行同步,如果想让线程向创建它的线程返回数据就需要这样做.但有时,也有这种情况,既不需要第二个...
  • yiranant
  • yiranant
  • 2015年07月06日 21:32
  • 404

线程取消点

概念: 线程取消: 取消操作允许线程请求终止其所在进程总的任何其他线程。不需要线程执行进一步操作时,可以选择取消操作。 取消点: 并不是你想什么时候取消线程就能取消的,要考虑到线程安全...
  • ShinichR
  • ShinichR
  • 2014年04月21日 21:52
  • 1862
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux程序设计——取消一个线程(第十二章)
举报原因:
原因补充:

(最多只允许输入30个字)