`
deepfuture
  • 浏览: 4411748 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80127
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70327
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103582
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:286543
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15053
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67782
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32290
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46075
社区版块
存档分类
最新评论

c-多线程-中止前清理

阅读更多

gcc -lpthread -std=c99 -o main main.c


deepfuture@deepfuture-laptop:~/mytest$ ./main

1chen1

2chen2

3chen6

4chen24

5chen120

6chen720

7chen5040

8chen40320

9chen362880

10chen3628800

11chen39916800

12chen479001600

13chen1932053504

14chen1278945280

15chen2004310016

16chen2004189184

17chen-288522240

18chen-898433024

19chen109641728

20chen-2102132736

21chen-1195114496

22chen-522715136

23chen862453760

24chen-775946240

25chen2076180480

1add1

10000print:250

clear:10000

thread0 已经取消!

thread1 已经取消!

thread2 不能被取消!

 

 

#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_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldstate);//设置线程不能中止的。  
  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的开发源码-多线程程序死锁检查 JCarder.zip

    基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...

    人工智能-项目实践-多线程-多线程爬虫-抓取淘宝商品详情页URL.zip

    人工智能-项目实践-多线程-多线程爬虫--抓取淘宝商品详情页URL 本项目是一个Java编写的多线程爬虫系统。此系统与我之前开发的ip-proxy-pools-regularly结合使用,共抓取了淘宝近3000个页面,从中解析到了近9万的...

    NET面试题-多线程编程与线程同步1

    【描述】:本篇文章主要探讨.NET框架下的多线程编程与线程同步相关的面试问题,包括线程与进程的区别、GUI线程访问控件限制、后台线程与前台线程、锁的使用以及线程同步的不同策略。 【标签】:“软件/插件”、...

    人工智能-项目实践-多线程-多线程网站目录穷举扫描修改版.zip

    人工智能-项目实践-多线程-多线程网站目录穷举扫描修改版 使用方法 python dirfuzz.py www.wooyun.org php python dirfuzz.py www.wooyun.org asp python dirfuzz.py www.wooyun.org jsp

    人工智能-项目实践-多线程-多线程知乎用户爬虫,基于python3.zip

    人工智能-项目实践-多线程-多线程知乎用户爬虫,基于python3 .Install redis # (ubuntu) apt-get install redis # or (centos) yum install redis # or (macos) brew install redis

    多线程相关知识源码-----多线程案例源码

    多线程相关知识源码-----多线程案例源码

    北大Java--多线程

    【北大Java--多线程】课程主要探讨了Java编程中多线程的相关概念和技术,这是在计算机科学中处理并发执行的重要部分。多线程允许在单一程序中同时执行多个任务,提高了程序的效率和响应性。 1. **多线程基本概念**...

    大恒-双相机开发-C#-多线程-项目开源

    《大恒双相机开发-C#-多线程项目开源解析》 在当今信息化时代,高效、稳定的图像处理系统成为许多领域不可或缺的技术支持。本项目"大恒-双相机开发-C#-多线程"正是这样的一个实例,它利用C#语言进行编程,实现了对...

    人工智能-项目实践-多线程-tonado的multi-thread 多线程封装.zip

    人工智能-项目实践-多线程-tonado的multi-thread 多线程封装 Quick Start 1.在“biz”目录中创建一个py文件,文件名任意但最好不要跟第三方库冲突 2.使用 "Router.route" 装饰器注册函数到路由表中,仿造示例即可 ...

    人工智能-项目实践-多线程-动态多线程敏感信息泄露检测工具.zip

    人工智能-项目实践-多线程-动态多线程敏感信息泄露检测工具 基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括: 规则...

    php-多线程扩展

    "php-多线程扩展"正是这样一个工具,它允许PHP代码在C语言级别上实现多线程功能,从而提升应用程序的性能。 这个扩展是用C语言编写的,因为它需要直接操作系统级别的资源,如线程,这是PHP解释器本身不直接支持的。...

    MFC多线程编程实例----多线程画线源码

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库进行多线程编程,特别是关注在MFC环境中创建和管理多个线程来实现并发画线的实例。MFC是一个面向对象的C++库,它为Windows应用程序开发提供了...

    人工智能-项目实践-多线程-60行代码实现多线程PDF转Word.zip

    人工智能-项目实践-多线程-60行代码实现多线程PDF转Word 使用方法 clone或下载项目到本地 git clone git@github.com:simpleapples/pdf2word.git 进入项目目录,建立虚拟环境,并安装依赖 cd pdf2word python3 -m ...

    java - juc - 多线程 - 学习 -思维导图

    java - juc - 多线程 - 学习 -思维导图

    Linux下C语言编程--线程操作

    `pthread`库提供了一系列API,使得开发者能够轻松地在C语言中实现多线程功能。 #### 二、线程的基本创建和使用 在Linux下创建和管理线程主要依赖于`pthread`库中的几个关键函数: 1. **`pthread_create`**: 创建...

    操作系统--多线程买票---python--有窗体界面

    操作系统--多线程买票---python--有窗体界面,就是操作系统课上的一个课外练习,传上去,保存下来。 exe文件在 map文件夹--&gt;dict文件夹--&gt;map文件夹--&gt;map.exe 已经打包好了,没有python环境的电脑上也...

    线程--管理线程(使线程中止,暂停,挂起等)

    在IT行业中,线程管理是多任务并发编程的关键部分,特别是在服务器端开发如ASP.NET中。本文将深入探讨如何在C#中管理线程,包括线程的中止、暂停和挂起,以及相关的同步机制。 首先,让我们讨论线程的创建与启动。...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

    VC学习-多线程的学习

    在编程领域,多线程是实现并发执行任务的重要机制,尤其在Windows环境下,Visual C++(简称VC)提供了丰富的多线程支持。本资源“VC学习-多线程的学习”显然是一个针对VC环境下多线程编程的学习资料,包含了源代码和...

    c语言-编译预处理指令#pragma omp-支持多线程

    在C语言中,`#pragma omp` 是一种编译预处理指令,用于开启OpenMP(Open Multi-Processing)功能,从而让程序支持多线程执行。OpenMP 是一个跨平台的共享内存并行编程模型,它允许程序员通过添加简单的API...

Global site tag (gtag.js) - Google Analytics