#include <pthread.h>
#include <stdio.h>
#define MAXTHREADS 3
void *myclear(void *x){
printf("clear:%d\n",*((int*)x));
}
void *mycompprint(void *xx){//参数必须为void *,然后进行强制类型转换
int oldstate,oldtype;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldstate);//设置线程是可以中止的。
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,&oldtype);//设置线程推迟中止,PTHREAD_CANCEL_DEFERRED为默认值。
int *x=(int *)(xx);
void *xxx=(void *)x;
pthread_cleanup_push(myclear,xxx);//压入线程清理堆栈,堆栈包含指向取消过程中执行例程的指针,即中止前执行一个清理。myclear为例程名,x为传给例程的参数
for (int i=1;i<*x;i++){
if ((i%250)==0) {//如果i为250的倍数则取消
printf("%dprint:%d\n",*x,i);
pthread_testcancel();//pthread_testcancel()检测是否需要取消,设置取消点,如果有挂起的取消请求,则在此处中止本线程
}
}
pthread_cleanup_pop(0); //从调用线程清理堆栈的顶部移走清理函数指针,但并不执行它,pthread_testcancel()检测不到取消请求,表示目前不需要取消,所以移走它。pthread_cleanup_pop(1)移走并执行它,即使并没有中止线程;
}
void *mycompadd(void *xx){//参数必须为void *,然后进行强制类型转换
int oldstate,oldtype;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldstate);//设置线程是可以中止的。
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&oldtype);//设置线程线程立即中止,PTHREAD_CANCEL_ASYNCHRONOUS表示线程立即终止。
int sum=0;
int *x=(int *)(xx);
int y;
for (int i=1;i<=*x;i++){
sum+=i;
printf("%dadd%d\n",i,sum);
}
}
void *mycompchen(void *xx){//参数必须为void *,然后进行强制类型转换
int oldstate,oldtype;
pthread_attr_t attr;
size_t size;
void *addr;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldstate);//设置线程不能中止的。
pthread_getattr_np(pthread_self(),&attr);//获取线程属性。
pthread_attr_getstack(&attr,&addr,&size);//线程属性,地址,大小
printf("size:%d\n",size); //输出线程堆栈大小
int sum=1;
int *x=(int *)(xx);
for (int i=1;i<=*x;i++){
sum*=i;
printf("%dchen%d\n",i,sum);
}
}
int main(){
//线程分离后,不能再合并
//main为boss线程,
pthread_t threads[MAXTHREADS];//创建线程池
void *status;
//创建worker线程,并执行线程
int n1=25;
int n2=10000;
//深未来技术原创,http://deepfuture.iteye.com
pthread_create(&(threads[0]),NULL,mycompprint,&n2);
pthread_create(&(threads[1]),NULL,mycompadd,&n1);
pthread_create(&(threads[2]),NULL,mycompchen,&n1);
for (int i=0;i<MAXTHREADS;i++){
pthread_cancel(threads[i]);
}
for (int i=0;i<MAXTHREADS;i++){
pthread_join(threads[i],&status); //wait worker线程,并合并到BOSS线程来
if (status==PTHREAD_CANCELED){
printf("thread%d 已经取消!\n",i);
}
else{
printf("thread%d 不能被取消!\n",i);
}
}
return(0);
}
分享到:
相关推荐
在操作系统中,每个线程都有自己的独立内存空间,这部分内存被称为线程堆栈。线程堆栈主要用于存储函数调用时的局部变量、函数参数、返回地址等信息。理解线程堆栈大小的使用对于优化程序性能和避免内存溢出至关重要...
Java线程堆栈详解 Java线程堆栈是一种强大的诊断工具,能够帮助开发者快速定位多线程应用程序中的问题。通过分析线程堆栈,可以找到系统中各种问题的根源,如系统无缘无故CPU过高、系统挂起、系统运行越来越慢、...
Breakpad是一款强大的开源工具,由Google开发,用于捕捉和记录应用程序的崩溃信息,包括系统信息和线程堆栈信息。本教程将详细介绍如何集成Breakpad到你的C/C++项目中,以便在发生native crash时收集关键信息。 **...
Linux下的C语言多线程编程 Linux下的C语言多线程编程是指在Linux操作系统中使用C语言编写多线程程序的技术。多线程编程是一种非常"节俭"的多任务操作方式,相比进程,它具有启动速度快、空间占用小、线程间通信...
下面将详细介绍堆栈和队列的概念以及如何用Object-C来实现它们。 **堆栈(Stack)** 堆栈是一种后进先出(Last In First Out,简称LIFO)的数据结构,它的工作原理类似于图书馆的书籍堆。当新的书籍加入时,会放在...
`CreateThread`函数需要提供线程函数的地址、线程的初始参数、堆栈大小、创建标志等信息。线程函数是一个返回`DWORD`类型的函数,接受一个`LPVOID`类型的参数,这通常用来传递线程需要的数据。 在VC++6.0中,程序是...
Visual Studio提供了一些工具,如线程视图,可以帮助开发者查看和跟踪各个线程的状态和调用堆栈。 在“Draw”这个子文件夹中,很可能包含了实现上述功能的源代码文件,包括`.cpp`和`.h`文件,以及可能的资源文件。...
- 线程堆栈是记录程序执行轨迹的一种方式,它反映了每个线程当前执行的方法序列。在Java中,可以通过`jstack`命令或在运行环境中通过`ctrl+break`(Windows)或`kill -3 <pid>`(Unix)来获取。 - 线程堆栈对于...
如果您是从C++/C转到Java上的程序员,那么线程堆栈应该不是陌生的技术,但对于原 生的Java程序员来说, 很多人不清楚还有这个这个密门绝技。 什么是线程堆栈1? 线程堆栈也称 作线程调用堆栈。Java线程堆栈是虚拟机...
在这个问题中,我们将探讨如何使用C语言中的堆栈数据结构来实现LRU算法。 首先,我们需要理解堆栈的基本概念。堆栈是一种后进先出(LIFO, Last In First Out)的数据结构,类似于日常生活中的堆叠物品,最后放入的...
* `stack_size`:线程堆栈的大小。 * `arglist`:传递给线程的参数的指针。 * `_beginthreadex()` 函数的参数: * `security`:安全属性。 * `stack_size`:线程堆栈的大小。 * `start_address`:线程函数的...
我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空 间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用...
DWORD dwStackSize, // 线程堆栈大小,可为0 LPTHREAD_START_ROUTINE lpStartAddress, // 线程入口函数 LPVOID lpParameter, // 传递给线程函数的参数 DWORD dwCreationFlags, // 创建标志,例如CREATE_...
内核对象是操作系统用于管理和存储线程信息的核心结构,而线程堆栈则保存函数参数和局部变量。在单进程环境中,多个线程共享同一地址空间,可以执行相同的代码并操作相同的数据。线程的执行是抢占式的,即系统会根据...
- 在多线程环境中,每个线程都有自己的异常堆栈,需要正确处理线程间的异常。 - 主线程可以通过`ThreadPool`的回调机制或`async/await`捕获异步任务中的异常。 9. **线程通信** - 线程间通信用于协调线程执行,...
`pstack`是一个简单但实用的命令行工具,它能够打印出运行时进程的线程堆栈信息。通过解析核心数据结构和利用`ptrace`,`pstack`可以为每个线程生成一个调用堆栈,显示每个线程正在执行的函数序列。 在`pstack`的...
### Linux多线程 C语言编程知识点总结 #### 一、多线程与多进程编程概述 **多线程**的概念可以追溯到20世纪60年代,然而直到80年代中期,这一机制才被正式引入到Unix系统中。随着计算机硬件的发展及软件需求的增加...
在Linux系统中,进行C语言的多线程编程主要依赖于POSIX线程接口,即pthread。POSIX标准定义了一套跨平台的线程API,使得开发者能够在多种操作系统上编写可移植的多线程程序。在Linux环境下,pthread库提供了一系列...