1 //============================================================================
2 // Name : thread.cpp
3 // Author : LittleKu
4 // Version :
5 // Copyright : LittleKu
6 // Description : thread in C++, Ansi-style
7 //============================================================================
8
9 #include <pthread.h>
10 #include <unistd.h>
11 #include <stdio.h>
12
13 using namespace std;
14
15 class Thread {
16 public:
17 Thread() {
18 this->_flag = 0;
19 this->_threadID = 0;
20 ::pthread_mutex_init(&this->_mutex, NULL);
21 ::pthread_cond_init(&this->_cond, NULL);
22 }
23 virtual ~Thread() {
24 ::pthread_mutex_destroy(&this->_mutex);
25 ::pthread_cond_destroy(&this->_cond);
26 }
27
28 bool Start(bool bSuspend = false) {
29 if (bSuspend)
30 SuspendThread();
31
32 if (this->_threadID == 0)
33 ::pthread_create(&this->_threadID, NULL, _ThreadFunc, this);
34
35 return (this->_threadID != 0);
36 }
37
38 void SuspendThread() {
39 if (this->_flag > 0) {
40 printf("thread has been suspend\n");
41 return;
42 }
43 __sync_lock_test_and_set((long*) &this->_flag, 1);
44 }
45
46 void Resume() {
47 if (this->_flag > 0) {
48 __sync_lock_test_and_set((long*) &this->_flag, 0);
49
50 ::pthread_mutex_lock(&this->_mutex);
51 ::pthread_cond_broadcast(&this->_cond);
52 ::pthread_mutex_unlock(&this->_mutex);
53 } else
54 printf("thread is running\n");
55 }
56
57 virtual void OnRun() {
58 while (this->_flag <= 0) {
59 printf("thread running\n");
60 ::usleep(1000 * 1000);
61 }
62 }
63
64 private:
65 static void *_ThreadFunc(void *param) {
66 Thread *pThis = (Thread*) param;
67 while (true) {
68 /**< suspend = true*/
69 if (pThis->_flag > 0) {
70 printf("thread suspend\n");
71
72 ::pthread_mutex_lock(&pThis->_mutex);
73 ::pthread_cond_wait(&pThis->_cond, &pThis->_mutex);
74 ::pthread_mutex_unlock(&pThis->_mutex);
75
76 } else {
77 pThis->OnRun();
78
79 //pThis->SuspendThread();
80 }
81 }
82 return NULL;
83 }
84 private:
85 pthread_t _threadID;
86 int _flag;
87 pthread_cond_t _cond;
88 pthread_mutex_t _mutex;
89 };
90
91 int main(int argc, char *argv[]) {
92
93 char ch;
94 Thread *t = new Thread;
95 t->Start(true);
96
97 while (1) {
98 ::scanf("%c", &ch);
99 switch (ch) {
100 case 's':
101 t->SuspendThread();
102 break;
103 case 'r':
104 t->Resume();
105 break;
106 default:
107 break;
108 }
109 }
110 delete t;
111
112 return 0;
113 }

linux 线程挂起恢复的更多相关文章

  1. GCD之线程挂起与恢复

    我们可以使用dispatch_suspend函数暂停一个queue以阻止它执行block对象;使用dispatch_resume函数继续dispatch queue.调用dispatch_suspen ...

  2. java并发编程(三)线程挂起,恢复和终止的正确方法

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733    下面我们给出不用上述两个方法来实现线程挂起和恢复的策略--设置标志位. ...

  3. 转: 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用 ...

  4. 【Java并发编程】:线程挂起、恢复与终止

    挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时 ...

  5. 解决FTPClient linux环境下FTPClient调用retrieveFileStream导致线程挂起(防火墙问题);下载文件小于实际文件问题

    FTPClient调用retrieveFileStream导致线程挂起(防火墙问题):下载文件小于实际文件问题解决 实际是因为FTP的两种传输模式:主动模式和被动模式的不同而导致的 FTPClient ...

  6. 【Java并发编程】之三:线程挂起、恢复与终止的正确方法

    挂起和恢复线程 ​ Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时), ...

  7. 通过 Javacore 诊断线程挂起等性能问题

    http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1406_tuzy_javacore/1406_tuzy_jav ...

  8. Linux线程编程之信号处理

    前言 Linux多线程环境中的信号处理不同于进程的信号处理.一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理. 本文首先介绍信号处理在进程中和线程 ...

  9. Linux 线程管理

    解析1 LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数的执行过程比较难于理解. pthread_cond_wait()的工 ...

随机推荐

  1. .NET CORE命令行

    目录 0. 基础命令行 1. 基础命令 2. SDK命令 3. 使用命令行创建. net Core项目 shanzm-2020年9月7日 22:00:00 0. 基础命令行 D:默认路径跳转到D盘 c ...

  2. 10 张图聊聊线程的生命周期和常用 APIs

    上一篇文章我们聊了多线程的基础内容,比如为什么要使用多线程,线程和进程之间的不同,以及创建线程的 4 种方式.本文已收录至我的 Github: https://github.com/xiaoqi666 ...

  3. Hexo博客迁移

    Hexo用户指南 - 博客迁移 GitHub+Hexo搭建博客的过程比较平滑,但是它的配置却非常耗时,一旦电脑出现问题或者需要在另外一台电脑上写博客,那么Hexo博客的迁移非常就让人头疼.下面参考其他 ...

  4. redis加固:修改默认端口6379、密码不为空、内网服务器访问

    一.windows下redis加固: 1.修改redis密码+修改redis端口 1.1.找到服务当中redis的属性配置文件是哪个   这个是我的"D:\Program Files\Red ...

  5. .NET 5.0 RC1 发布,离正式版发布仅剩两个版本

    原文:http://dwz.win/Qf8 作者:Richard 翻译:精致码农-王亮 说明:1. 本译文并不是完全逐句翻译的,存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了.2 ...

  6. 预科班D9

    2020.09.17星期四 预科班D9 学习内容: 一.列表与字典的嵌套 大前提:将所有同学的信息存起来,取值需求 1.取第二个学生的性别 stus_info = [ {"name" ...

  7. Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别

    转载自 https://blog.csdn.net/java_zyq/article/details/83818341 在K8S上部署Redis集群时突然遇到一个(sentinel哨兵模式)概念,感觉 ...

  8. JVM学习(六)JVM常见知识问答

    文章更新时间:2020/04/21 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程. Java源文 ...

  9. 从 LRU Cache 带你看面试的本质

    前言 大家好,这里是<齐姐聊算法>系列之 LRU 问题. 在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题. 技术面试究竟在考什么 在人人都知道刷题的今天,面试官也都知道大家会 ...

  10. 金蝶k/3 cloud 生产用料清单下推生成调拨单二开记录

    系统默认的生产用料清单下推生成调拨单功能,是根据调拨选单数量来的,有库存和没有库存的都混在一起,导致业务人员审核调拨单的时候需要删除没有库存的分录行,严重影响工作效率. 现通过二开程序,根据生产用料清 ...