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. Oracle SQL Developer中查看解释计划Explain Plan的两种方法

    方法一: 比如要查看解释计划的SQL是:select * from hy_emp 那么在输入窗口输入: EXPLAIN PLAN FOR select * from hy_emp 之后执行,输出窗口会 ...

  2. 2019UNCTF

    Easyshellcode: 不说了,都是没有工具的血泪史,直接上exp: from pwn import * from numbers import * from ae64 import AE64 ...

  3. Python - 网易邮箱邮件阅读和删除辅助小脚本

    摘要:[原创]转载请注明作者Johnthegreat和本文链接 简介:在Windows下的网易邮箱大师客户端中,阅读邮件时,可以使用快捷键Delete删除邮件,然后自动跳到下一封,如果再按一次Dele ...

  4. 深入理解Java之装箱与拆箱

    一.Java数据类型 1.在说装箱与拆箱之前,先说一下Java的基本数据类型,Java从数据类型上可以划分为值类型与引用类型,值类型是四类八种,分别是: 整数型:byte̵,short̵,int̵,l ...

  5. 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)

    1. 前言 在爬虫.自动化.数据分析.软件测试.Web 等日常操作中,除 JSON.YAML.XML 外,还有一些数据经常会用到,比如:Mysql.Sqlite.Redis.MongoDB.Memch ...

  6. Docker介绍及常用操作演示(一)

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互 ...

  7. (专题一)03 matlab变量及其操作

    给内存单元取名字就可以访问内存单元 变量的命名:变量名区分大小写 标准函数名以及命名方式必须用小写字母 matlab赋值语句有两种表达式 变量的管理       1.预定义变量  ans 是默认赋值变 ...

  8. Docker之概述

    我们常常需要将应用程序部署在独立的系统环境中,而使用物理机器部署会浪费大量的物理资源.能否讲物理机器虚拟成一个一个容器,而将程序部署在各自的容器中?Docker是一个能够把开发的应用程序自动部署到容器 ...

  9. @Autowried入门和源码分析

    话不多说直接上代码: 声明一个接口userDao: package ioc.hello; public interface UserDao { public void test(); } 2个实现类: ...

  10. Asp.Net Core Log4Net 配置分多个文件记录日志(不同日志级别)

    本文所有配置都是在core3.1环境下. 首先看看最终的效果. 请求监控:对每次请求的相关信息做一个记录. 全局异常:我不想我的错误信息,跟其他的信息混合在一起,查看的时候不大方便. 应用日志:这个主 ...