记得在windows下有一个SuspendThread使线程挂起的函数,却发现linux下没有类似的函数,于是想自己写个。。
刚开始就想到用信号(没办法,正在看auep,只能想到这个)
test1:
用pthread_kill将SIGSTOP信号发送到要暂停的线程

期望结果:线程暂停
实际结果:进程暂停

结论:oh, shit,查了查书·信号是进程范围的,还有SIGSTOP是无法捕获的,失败·

于是,又想了个方法:
test2:

还有用信号,不过这次改用自定义的SIGUSR1(用于挂起)和SIGUSR2(用于唤醒)
在SIGUSR1处理函数中等待SIGUSR2信号就好了呀··
但问题就来了,书上信号是进程范围的,按照我的理解现进程中的所有线程应该都被挂起才是,
要是把处理函数中阻塞在这··,这程序不是不能跑了·

结论:想想都觉得不可能,所以就放弃了

接下来就是一番baidu,google,终于在一个论坛找到了(地址忘了),想法跟上面test2的基本一致,接下来就是依葫芦画瓢了,
有了下面的小程序,有问题希望不吝指出!!

总结:一、对signal的处理还不是很理解
              1、signal是在接收的线程执行处理函数,不影响其它线程?
           二、不要轻易放弃自己的想法,不要过早认定“这不可能的,绝对地”

三、东西不是think出来的,是do出来 的,有了想法就去do

问题:1、很多函数不是异步信号安全的,所以这样做基本无意义···,汗··

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>#define SIGRESUME SIGUSR2
#define SIGSUSPEND SIGUSR1/* Thread specied var, the status*/
static __thread int g_bSuspend;void* task1(void *param)
{while(1){printf("***************************\n");sleep(1);}
}
void* task2(void *param)
{while(1){printf("##############################\n");sleep(2);}
}void suspend_handler(int signum)
{g_bSuspend = 1;sigset_t nset;pthread_sigmask(0, NULL, &nset);/* make sure that the resume is not blocked*/sigdelset(&nset, SIGRESUME);while(g_bSuspend) sigsuspend(&nset);
}void resume_handler(int signum)
{g_bSuspend = 0;
}int suspend( pthread_t thread)
{return pthread_kill( thread, SIGSUSPEND);
}int resume( pthread_t thread)
{return pthread_kill (thread, SIGRESUME);
}int main()
{struct sigaction suspendsa = {0};struct sigaction resumesa = {0};suspendsa.sa_handler =  suspend_handler;sigaddset(&suspendsa.sa_mask, SIGRESUME);sigaction( SIGSUSPEND, &suspendsa, NULL);resumesa.sa_handler = resume_handler;sigaddset(&resumesa.sa_mask, SIGSUSPEND);sigaction( SIGRESUME, &resumesa, NULL);pthread_t runTh1;pthread_t runTh2;pthread_create(&runTh1, NULL, task1, NULL);pthread_create(&runTh2, NULL, task2, NULL);while( 1 ){getchar();suspend( runTh1);suspend( runTh2);//sleep(5);resume( runTh1);sleep(5);resume( runTh2);}return 0;
}

linux下实现线程暂停相关推荐

  1. linux下 如何用信号signal 终止或者暂停子线程,linux下实现线程暂停

    记得在windows下有一个SuspendThread使线程挂起的函数,却发现linux下没有类似的函数,于是想自己写个.. 刚开始就想到用信号(没办法,正在看auep,只能想到这个) test1: ...

  2. Linux下通用线程池的创建与使用

    Linux下通用线程池的创建与使用 本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关.另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整 ...

  3. 【Linux下】 线程同步 生产者与消费者模型

    文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...

  4. Linux怎样给线程取名字,Linux下指定线程的名字

    为了能方便的区分一个进程中的每个线程,可以通过prctl()给每个线程取个名字.这样在会创建多个线程的程序执行过程中,就能知道一个pid或tid对应的是哪个线程,对调试程序有一定帮助. prctl是个 ...

  5. Linux之多线程(上)——Linux下的线程概念

    文章目录 前言 一.地址空间和页表 1.二级页表 2.例子 二.线程 1.概念 重新理解前面讲的进程:在内核的视角,进程是承担分配系统资源的基本实体. 站在CPU角度,能否去识别当前调度的task_s ...

  6. Linux下获得线程ID syscall(224)

    From: http://blog.163.com/onx0320@126/blog/static/164736436201252574720314/ 对于Linux线程,也许大家并不陌生,而我们通常 ...

  7. 一个Linux下C线程池的实现

    什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽 视,这时也是线程池该出场的机会了.如果线程创建和销毁时间相比 ...

  8. 一个Linux下C线程池的实现(转)

    1.线程池基本原理 在传统服务器结构中, 常是 有一个总的 监听线程监听有没有新的用户连接服务器, 每当有一个新的 用户进入, 服务器就开启一个新的线程用户处理这 个用户的数据包.这个线程只服务于这个 ...

  9. linux的创建线程池,Linux下通用线程池的创建与使用(上) (3)

    线程的状态可以分为四种,空闲.忙碌.挂起.终止(包括正常退出和非正常退出).由于目前Linux线程库不支持挂起操作,因此,我们的此处的挂起操作类似于暂停.如果线程创建后不想立即执行任务,那么我们可以将 ...

最新文章

  1. SQL语句一次INSERT多条记录的方法
  2. 三星s5能升级到android7.0,三星手机Android 7.0升级的最新列表: Galaxy S5,未注意Note 4...
  3. 字符流与字节流转换输出
  4. 程序员如何保持身心健康,做到这几点,远离秃头。
  5. leetcode —— 34. 在排序数组中查找元素的第一个和最后一个位置
  6. STM32之点亮LED
  7. 列顺序对SQL Server复合索引的影响
  8. 1-4课:程序、编程和算法之间到底有什么三角关系?
  9. [项目管理-6]:软硬件项目管理 - 项目沟通管理(渠道、方法)
  10. UltraCompare Professional Version 7.20.0.1009 注册码
  11. 关于常用第三方统计平台比较
  12. 军工研究所需要计算机专业吗,8大军工研究所之选择——一名毕业生求职的亲身感受...
  13. 史上最全的javascript知识点总结,浅显易懂。
  14. 2-SAT问题,一个神奇的东西
  15. 什么是最长前缀匹配?为什么网络前缀越长,其地址块就越小,路由就越具体?
  16. Jenkins自动化搭建测试环境
  17. 均方根值(RMS)、均方根误差(RMSE)、各种平均值
  18. MMU简单处理TLB例外
  19. MT6737 平台TP driver分析(二)
  20. android 回编译失败,Androidkiller 回编译失败

热门文章

  1. 使用OpenCV检测摄像头视频中的人脸
  2. 微信公众平台开发(六) 翻译功能开发
  3. 【H5】 h5运行在手机浏览器查看控制台信息
  4. 基于C语言的简单小游戏-(扫雷)
  5. 计算机三级网络技术最全知识点总结【5】
  6. P20到P23js知识点
  7. 关于iPhone出现白苹果黑屏现象的修复方法
  8. html 获取声音频谱,[前端]利用WebAudioAPI获取音频频谱(html5音频可视化)
  9. 微信商户平台企业付款功能
  10. Spring Cloud-Alibaba