linux 线程挂起恢复
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 线程挂起恢复的更多相关文章
- GCD之线程挂起与恢复
我们可以使用dispatch_suspend函数暂停一个queue以阻止它执行block对象;使用dispatch_resume函数继续dispatch queue.调用dispatch_suspen ...
- java并发编程(三)线程挂起,恢复和终止的正确方法
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 下面我们给出不用上述两个方法来实现线程挂起和恢复的策略--设置标志位. ...
- 转: 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用 ...
- 【Java并发编程】:线程挂起、恢复与终止
挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时 ...
- 解决FTPClient linux环境下FTPClient调用retrieveFileStream导致线程挂起(防火墙问题);下载文件小于实际文件问题
FTPClient调用retrieveFileStream导致线程挂起(防火墙问题):下载文件小于实际文件问题解决 实际是因为FTP的两种传输模式:主动模式和被动模式的不同而导致的 FTPClient ...
- 【Java并发编程】之三:线程挂起、恢复与终止的正确方法
挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时), ...
- 通过 Javacore 诊断线程挂起等性能问题
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1406_tuzy_javacore/1406_tuzy_jav ...
- Linux线程编程之信号处理
前言 Linux多线程环境中的信号处理不同于进程的信号处理.一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理. 本文首先介绍信号处理在进程中和线程 ...
- Linux 线程管理
解析1 LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数的执行过程比较难于理解. pthread_cond_wait()的工 ...
随机推荐
- java-对象引用和对象本身
示意图 应用场景 1.赋值 只有用新的对象本身直接赋值给对应引用,该对象引用的值会改变,因为对象引用指向的对象本身改变了. 2.方法入参 调用方法和被调用方法. 代码 import com.aliba ...
- Beware of the encrypted VM
A friend of mine Megan told me that she got an error message as below screenshot when trying to open ...
- 剑指 Offer 56 - I. 数组中数字出现的次数
题目描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是\(O(n)\),空间复杂度是\(O(1)\). 示例1: 输入:nums ...
- 在Linux命令行里与其他用户通信
大家好,我是良许 在 Linux 命令行里向其他用户发送信息很简单,很多命令都可以做到这点,麻烦的是你需要从众多命令中挑选一个合适的命令来使用.因此,我挑选了四种常用的 Linux 用户通信命令分享给 ...
- React和Vue的异同
Vue和React是时下比较受欢迎的三巨头之二,对Angular不慎了解,就不在赘述. React是由Facebook开发的一个js ui框架,其最大的变化就是VirtualDOM和新语法JSX vu ...
- Linux:crond(crontab)定时任务
一..定义 Crond 是linux系统中用来定期执行命令或指定程序任务的一种服务或者软件.一般在安装完系统时,crond会默认存在. crond默认每分钟会检查系统中是否有需要执行的定时任务.如果有 ...
- 使用镜像安装cygwin、gcc并配置CLion IDE -2020.09.12
使用镜像安装cygwin.gcc并配置CLion IDE -2020.09.12 Cygwin 官网:http://www.cygwin.com/ 下载64bit安装器,并打开选择next 尽量不要装 ...
- 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 3 - Shallow Neural Networks(第三周测验 - 浅层神 经网络)
Week 3 Quiz - Shallow Neural Networks(第三周测验 - 浅层神经网络) \1. Which of the following are true? (Check al ...
- git代码管理——克隆项目到本地仓库及上传本地项目到仓库
一.克隆项目到本地仓库 1.github网站操作 1.1 登录github 首先创建一个仓库,点击“New” 1.2 输入仓库信息 1.3 创建完成后,会多出一个仓库 2.安装git客户端 2.1 安 ...
- 本机浏览器无法访问linux的tomcat
原因:Centos7的防火墙拦截了tomcat访问的8080端口 Redhat 等等linux firewall-cmd --permanent --zone=public --add-port=8 ...