Linux多线程实例练习 - pthread_cancel()

Linux多线程实例练习 - pthread_cancel

1、代码 xx_pthread_cancel.c

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

#define debug_Msg(fmt, arg...)    do{        printf("%s %d : ", __FILE__, __LINE__);        printf(fmt, ##arg);    }while(0)

#define ENABLE_X
char * pe = "enable  return";
void * state_Enable(void *arg)
{
    int i = 0;
    int iExit = 0;
    while(i < 10 && iExit == 0)
    {
        debug_Msg("state Enable  : [%d]\n", i);
        i++;
        sleep(1);
    }
    char * p = pe;
    return p;
}

#define DISABLE_X
char * pd = "disable return";
void * state_Disable(void * arg)
{
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
    int i = 0;
    int iExit = 0;
    while(i < 10 && iExit == 0)
    {
        debug_Msg("state Disable : [%d]\n", i);
        i++;
        sleep(1);
    }
    char * p = pd;
    return p;
}

int main()
{
#ifdef ENABLE_X
    pthread_t pid;
    pthread_create(&pid, NULL, state_Enable, NULL);
    sleep(3);
    pthread_cancel(pid);
    void * p = NULL;
    printf("init with : [%08X]\n", (unsigned int)p);
    pthread_join(pid, &p);
    printf("pe addr   : [%08X]\n", (unsigned int)pe);
    printf("over with : [%08X]\n", (unsigned int)p);
#endif

#ifdef DISABLE_X
    pthread_t pDis;
    pthread_create(&pDis, NULL, state_Disable, NULL);
    sleep(3);
    pthread_cancel(pDis);
    p = NULL;
    printf("init with : [%08X]\n", (unsigned int)p);
    pthread_join(pDis, &p);
    printf("pd addr   : [%08X]\n", (unsigned int)pd);
    printf("over with : [%08X]\n", (unsigned int)p);
#endif
}

2、CentOS 编译通过

g++ -g -c -o xx_pthread_cancel.o xx_pthread_cancel.c
g++ -g -o xx_pthread_cancel xx_pthread_cancel.o -lpthread

3、运行结果

$ ./xx_pthread_cancel
xx_pthread_cancel.c 19 : state Enable  : [0]
xx_pthread_cancel.c 19 : state Enable  : [1]
xx_pthread_cancel.c 19 : state Enable  : [2]
init with : [00000000]
pe addr   : [08048959]
over with : [FFFFFFFF]
xx_pthread_cancel.c 36 : state Disable : [0]
xx_pthread_cancel.c 36 : state Disable : [1]
xx_pthread_cancel.c 36 : state Disable : [2]
init with : [00000000]
xx_pthread_cancel.c 36 : state Disable : [3]
xx_pthread_cancel.c 36 : state Disable : [4]
xx_pthread_cancel.c 36 : state Disable : [5]
xx_pthread_cancel.c 36 : state Disable : [6]
xx_pthread_cancel.c 36 : state Disable : [7]
xx_pthread_cancel.c 36 : state Disable : [8]
xx_pthread_cancel.c 36 : state Disable : [9]
pd addr   : [08048968]
over with : [08048968]
时间: 2024-10-29 19:13:29

Linux多线程实例练习 - pthread_cancel()的相关文章

Linux多线程

1. Linux多线程概述 1.1. 概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段.这就造成进程在进行切换等操作时都需要有比较负责的上下文切换等动作.为了进一步减少处理器的空转时间支持多处理器和减少上下文切换开销,也就出现了线程. 线程通常叫做轻量级进程.线程是在共享内存空间中并发执行的多道执行路径,是一个更加接近于执行体的概念,拥有独立的执行序列,是进程的基本调度单元,每个进程至少都有一个main线程.它与同进程中的其他线程共享进程空间{堆 代码 数据

Linux多线程编程初探

Linux 线程介绍 进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务. 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位.在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器.程序本身只是指令.数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例. 线程是操作系统能够进行运算调度的最小单位

Linux多线程编程小结

 Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序设计第3版>. 1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(由于线程有自己的局部变量),但与它的创建者共享全局变量.文件描写叙述符.信号句柄和当前文件夹状态. Linux通过fork创建子进程与创建线程之间是有差别的:fork创建出该进程的一份拷贝,这个新进程拥有自己的

Linux多线程编程详解 [By: HarryAlex]

本文内容主要参考于<Linux程序设计·第3版>.<Linux环境C程序设计>.<C语言核心技术>.<深入理解计算机系统·第2版>,代码运行环境: Linux version 3.10.0-123.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Thu Jun 4 17:17:49 CST 2015 1. Linux进程与

C Linux 多线程入门

C Linux 多线程入门 ××× 入门示例 ????启动和停止直接使用接口即可,暂停和恢复需要自己定义,大体的代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> struct si

linux iptables 实例1

柘扑图: shell脚本: 说明:内网可以正常上网,只能通过端口访问DMZ里的服务器 firewall服务器和DMZ里的器不能上网,但是可以指定访问外网某个IP 外网可以通过访问DNAT映射访问内网web和FTP服务器 指定某个IP进行管理iptables,不允许外网进行管理 服务器不能主动上外网 [[email protected] ~]# cat /opt/firewall.sh #!/bin/bash /sbin/modprobe nf_conntrack_ftp /sbin/modpro

《Linux多线程编程手册》读书笔记

第二章 基本线程编程 1.(P25)如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止.然后,一个等待线程成功返回,其余的等待线程将失败并返回ESRCH错误. 2.(P26)将新线程的pbe参数作为栈参数进行传递.这个线程参数之所以能够作为栈参数传递,是因为主线程会等待辅助线程终止.不过,首选方法是使用malloc从堆分配存储,而不是传递指向线程栈存储的地址.如果将该参数作为地址传递到线程栈存储,则该地址可能无效或者在线程终止时会被重新分配. 3.(P28)pthread_de

linux 多线程信号处理总结

linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知.也就是说,信号会随机发个该进程的一个线程. 2 signal函数BSD/Linux的实现并不在信号处理函数调用时,恢复信号的处理为默认,而是在信号处理时阻塞此信号,直到信号处理函数返回.其他实现可能在调用信号处理函数时,恢复信号的处理为默认方式,因而需要在信号处理函数中重建信号处理函数为我们定义的

Linux多线程程序设计------创建线程

1.创建线程 #include<pthread.h> int pthread_create(pthread_t* tidp,const pthread_attr_t *attr,void*(*start_rtn)(void),void*arg) tidp:线程id attr:线程属性(通常为空) start_rtn:线程要执行的函数 arg:start_rtn的参数 Linux多线程程序设计------创建线程,布布扣,bubuko.com