linux下pthread_cancel无法取消线程的原因

一个线程可以调用pthread_cancel终止同一进程中的另一个线程,但是值得强调的是:同一进程的线程间,pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程。或调用pthread_testcancel,让内核去检测是否需要取消当前线程。被取消的线程,退出值,定义在Linux的pthread库中常数PTHREAD_CANCELED的值是-1。

#include <pthread.h>

int pthread_cancel(pthread_t thread);

看下面程序:

#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
void *thread_fun(void *arg)
{
	int i=1;
	printf("thread start \n");
	while(1)
	{
		i++;
	}
	return (void *)0;
}
int main()
{
	void *ret=NULL;
	int iret=0;
	pthread_t tid;
	pthread_create(&tid,NULL,thread_fun,NULL);
	sleep(1);

	pthread_cancel(tid);//取消线程
	pthread_join(tid, &ret);
	printf("thread 3 exit code %d\n", (int)ret);

	return 0;

}

会发现程序再一直运行,线程无法被取消,究其原因pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程。如果线程里面没有执行系统调用,可以使用pthread_testcancel解决。

#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
void *thread_fun(void *arg)
{
	int i=1;
	printf("thread start \n");
	while(1)
	{
		i++;
		pthread_testcancel();
	}
	return (void *)0;
}
int main()
{
	void *ret=NULL;
	int iret=0;
	pthread_t tid;
	pthread_create(&tid,NULL,thread_fun,NULL);
	sleep(1);

	pthread_cancel(tid);//取消线程
	pthread_join(tid, &ret);
	printf("thread 3 exit code %d\n", (int)ret);

	return 0;

}

版权声明:欢迎转载,如有不足之处,恳请斧正。

时间: 2024-11-09 10:41:55

linux下pthread_cancel无法取消线程的原因的相关文章

linux下pthread_cancel无法取消线程的原因【转】

转自:http://blog.csdn.net/huangshanchun/article/details/47420961 版权声明:欢迎转载,如有不足之处,恳请斧正. 一个线程可以调用pthread_cancel终止同一进程中的另一个线程,但是值得强调的是:同一进程的线程间,pthread_cancel向另一线程发终止信号.系统并不会马上关闭被取消线程,只有在被取消线程下次系统调用时,才会真正结束线程.或调用pthread_testcancel,让内核去检测是否需要取消当前线程.被取消的线程

【转】linux下C语言使用线程池(附带编码)

原文链接: linux下C语言使用线程池(附带编码) - china_sky - 博客频道 - CSDN.NEThttp://blog.csdn.net/feige2008/article/details/7827390 使用一个东西,我们要明白为什么使用它,如何使用它,使用它能达到什么效果 在写本文章时,我也借鉴了网上的部分资源,因为是之前很早搜索到的资料无法追踪源头,所以在此不再写来源,谨感谢各位大神. 1    使用线程池的原因 通常使用多线程都是在需要的时候创建一个新的线程,然后执行任务

Linux下c开发 之 线程通信(转)

Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程. 大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量).Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚.因此,L

Linux下的进程与线程(二)—— 信号

Linux进程之间的通信: 本文主要讨论信号问题. 在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程. 然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得以知道的. Linux系统的进程之间是通过信号来通信的. 程序员在Shell上显式地发送信号使用的是kill命令,原型如下: kill -sigid [-]pid 其中, sigid指示的是信号的id,pid前若有-,则pid代表的为进程组id,否则pid代表的为进程id kill函数也有相同的作用

Linux下查看进程和线程

在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册中说:H Show threads as if they were processes 这样可以查看所有存在的线程. 3.ps -mp <PID> 手册中说:m Show threads after processes 这样可以查看一个进程起的线程数. 查看进程 1. top 命令 top命令查看

linux下如何获取每个线程的CPU占用率

啥也不说,直接上脚本: [email protected]:/mnt/mtd# cat cpu.sh #!/bin/sh while true do ps -H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu sleep 1 done [email protected]:/mnt/mtd#

linux下对进程与线程基本操作常用命令(转)

转载自:http://blog.csdn.net/eric41050808/article/details/9023285 1.ps命令功能:进程状态查询语法:ps [选项]常用选项:-a:显示所有用户进程 2.kill命令功能:发送信号.终止进程语法:kill [选项] [进程号]常用选项:-s:指定发送的信号-l:信号的名称列表-n:指定信号编号[-signalname]:包含信号名称前缀SIG的信号名 3.ipcs命令功能:显示进程通信状态,包括消息队列.共享内存.信号量(信号灯)语法:i

初试Linux下的线程编程

如何创建线程 Linux下一般使用POSIX线程库,也叫pthread.编写线程函数需要注意的是线程函数的返回类型必须是void*:程序编译的时候记得要链接上pthread库,方法:-lpthread 简单的线程程序 下面是简单的线程程序,主程序里创建了2个线程,分别打印不同的信息.每个线程用pthread_create函数来创建.每个线程运行完程序之后,必须使用pthread_join函数来等待线程结束,也就是回收线程.一旦两个线程都退出后,主程序就会退出. #include <stdio.h

linux 下C/C++程序常用调试方法(gdb)

 不管是在开发或者运行过程中,调试保证程序正常运行最基本的手段,熟悉这些调试方式,方便我们更快的定位程序问题所在,提高开发效率. 一 程序正常运行调试 (1)  直接使用gdb 开发过程中最常用的方式,我们可以在其过程中给程序添加断点,监视等辅助手段,监控其行为是否与我们设计相符,比如: (2)      程序已经运行,通过attach附加到进程 二 程序中断后调试 首先简单介绍下linux 下的信号: 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过