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

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);
}
 
分享到:
评论

相关推荐

    iOS多线程编程指南(中文版)

    ### iOS多线程编程指南(中文版)知识点详解 #### 一、多线程编程概述 **1.1 什么是多线程** 多线程是指在一个应用程序中同时运行多个线程,每个线程都可以独立执行任务。在iOS开发中,多线程能够充分利用设备的...

    C++ 如何正确的使用线程 释放线程资源

    在C++中,正确地使用和管理线程是多线程编程中的一个关键话题。线程的创建和释放关系到资源的管理以及程序的稳定性和效率。本文将详细讨论如何在C++中正确使用线程以及如何释放线程资源,并重点阐述joinable状态和...

    ubuntu skills

    随着开源文化的普及与技术的发展,越来越多的人开始使用 Ubuntu 这一优秀的 Linux 发行版。无论是对于新手还是经验丰富的用户来说,掌握一些实用的技巧都是非常必要的。本文旨在提供一系列 Ubuntu 使用技巧,帮助...

    ubuntu命令技巧

    - **多线程下载**:使用`axel &lt;url&gt;`或`aria2c &lt;url&gt;`。 - **查看HTTP头**:`curl -I &lt;url&gt;`。 - **快速使用http方式共享目录**:`python -m http.server &lt;port&gt;`。 - **SSH远程端口转发**:`ssh -L &lt;local_port&gt;:...

    Ubuntu_命令技巧

    ### Ubuntu命令技巧详解 #### 一、安装与升级 **1.1 查看软件安装内容** 使用`dpkg -L &lt;package-name&gt;`命令可以查看指定软件包...使用`tcpdump -c 20000 -nn -i any | grep -c 'IP.*src.*192\.168\.1\.100'`命令可以...

    Ubuntu命令技巧.pdf

    - 使用 `axel -n 4 &lt;url&gt;` 命令进行多线程下载。 #### 七、服务管理 **7.1 添加一个服务** - 使用 `systemctl enable &lt;service&gt;.service` 命令添加服务到开机启动项。 **7.2 删除一个服务** - 使用 `systemctl ...

    ubuntu skills ubuntu命令技巧(pdf格式)

    使用多线程下载文件,可以使用`aria2c`或`axel`工具。 #### 七、服务管理 ##### 7.1 添加一个服务 添加服务到系统服务列表中,可以使用`systemctl enable &lt;service-name&gt;.service`命令。 ##### 7.2 删除一个服务 ...

Global site tag (gtag.js) - Google Analytics