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

C-多线程-取消及取消点

阅读更多

 

线程取消

编译:

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

 

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

10000print:250

10000print:500

10000print:750

1add1

1chen1

thread0 已经取消!

thread1 已经取消!

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

thread2 不能被取消!

deepfuture@deepfuture-laptop:~/mytest$ 

 

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

#define MAXTHREADS 3 

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);  
  for (int i=1;i<*x;i++){
    if ((i%250)==0) {//如果i为250的倍数则取消
     printf("%dprint:%d\n",*x,i);     
     pthread_testcancel();//pthread_testcancel()检测是否需要取消,设置取消点,如果有挂起的取消请求,则在此处中止本线程
    }    
  }
}


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

相关推荐

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

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

    AS/400-多线程编程技术.pdf

    在多线程环境下调用C程序时,需要特别注意线程安全问题,确保调用的库函数能够正确处理并发访问。 ##### 1.6 多线程编程的通讯问题 多线程编程中的通讯问题是确保程序正确执行的关键。常见的通讯机制包括信号量、...

    OC-多线程-上下文切换

    当我们谈论“OC-多线程-上下文切换”时,我们实际上是在讨论Objective-C中多线程环境下的一个核心概念。上下文切换是操作系统调度线程执行的一种机制,它涉及到保存当前线程的状态并恢复另一个线程的状态,以便线程...

    iOS-多线程面试题.pdf

    ### iOS多线程面试知识点 #### 一、进程与线程 ##### 1. 进程概念 - **定义与功能**:进程是具有一定独立功能的程序关于某次数据集合的一次运行活动,是操作系统分配资源的基本单元。它代表了一个程序的执行过程,...

    (中英文)-POSIX多线程程序设计-Programming with POSIX Threads

    《Programming with POSIX Threads》是David Butenhof撰写的一本经典教程,主要针对Unix/Linux环境下的多线程程序设计。本书深入浅出地介绍了POSIX线程(也称为pthreads)API,是理解并掌握多线程编程的重要参考资料...

    swift-iOS多线程详细Demo

    - GCD是Apple推出的一种多线程解决方案,基于C语言,但在Swift中同样适用。 - GCD提供队列(Dispatch Queue)管理线程,分为串行队列和并行队列。 - 串行队列:任务依次执行,同一时间只有一个任务在运行。 - ...

    C语言多线程编程之线程池

    在IT领域,尤其是在系统编程和并发处理中,C语言多线程编程是一个重要的主题。线程池是一种优化的线程管理技术,它提高了系统资源的利用率,并降低了线程的创建和销毁开销。本文将深入探讨C语言中的线程池及其相关...

    学士学位论文--多线程网络文件传输系统的设计与实现.doc

    论文可能详细介绍了如何在C/S(客户端/服务器)架构下设计和实现多线程,以提高网络通信的并行性和效率。 2. **数据传输协议**:文件传输通常依赖于TCP/IP协议族,如TCP(传输控制协议)确保数据的可靠传输,而IP...

    操作系统上机-Linux多线程编程

    在实际操作中,可能还需要关注线程安全的数据结构、异常处理以及线程局部存储(TLS,Thread Local Storage)等高级主题,这些都是Linux多线程编程中不可或缺的知识点。通过不断的实践和调试,你将能更好地掌握这一...

    qnx多线程编程

    QNX通过C语言库函数支持多线程编程,相关API定义在`&lt;pthread.h&gt;`头文件中。下面详细介绍几个关键函数: ##### 3.1 线程的创建 ```c int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*...

    linux C 多线程编程典型实例

    本实例集主要针对Linux环境下的C语言多线程编程,旨在帮助开发者深入理解和实践多线程的创建、同步、通信以及管理等关键概念。 1. **线程创建**: 在Linux中,多线程通常通过POSIX线程库(pthread)实现。`pthread...

    QNX环境下多线程编程

    QNX多线程库函数是作为C语言库函数的一部分使用的,头文件是pthread.h。QNX提供了符合POSIX1003.1c标准的与线程相关的API,例如pthread_create()、pthread_join()、pthread_cancel()等。这些函数可以用于线程的创建...

    linux多线程编程指南

    ### Linux多线程编程指南知识点总结 #### 一、多线程基础介绍 - **定义多线程术语:** - **线程(Thread)**:进程内的一个执行单元,是CPU调度的基本单位。 - **并发(Concurrency)**:多个任务同时进行的概念,但...

    多线程.rar

    本文将深入探讨在iPhone开发中使用Object-C实现多线程的相关知识点。 一、多线程基础 1. 主线程:主线程是应用的入口,负责处理UI更新和用户交互。为了保证界面的流畅,所有的UI操作应该在主线程上进行。 2. 工作...

    linux 多进程多线程编程

    Linux 多进程多线程编程是指在 Linux 操作系统下使用 C 语言进行多进程和多线程编程的技术。该技术可以大幅度提高程序的执行效率和响应速度,提高系统的并发能力和资源利用率。 1. 创建缺省线程 在 Linux 系统下,...

    Linux多线程编程手册,linux多线程编程手册pdf,C,C++源码.zip

    通过阅读《Linux多线程编程手册》和研究C、C++源码,开发者可以深入了解Linux环境下的多线程编程技术,从而编写出高效、稳定的并发程序。理解并掌握这些知识,对于提升软件性能、优化系统资源利用至关重要。

Global site tag (gtag.js) - Google Analytics