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()的工 ...
随机推荐
- 2020年1月31日 安装Python的requests包记录
C:\Users\ufo>pip install requests Collecting requests WARNING: Retrying (Retry(total=, connect=No ...
- Python中自己不熟悉的知识点记录
重点笔记: Python 它是动态语言 动态语言的定义:动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在 运行时可以改变其结构的语言 : ...
- 解决 Mac 上 Docker 无法直接 ping 通的问题
解决 Mac 上 Docker 无法直接 ping 通的问题 原文连接 一.背景 Mac os Mojave 10.14.3 Docker Desktop community 2.3.0.4 二.问题 ...
- oracle之三rman 不完全恢复
rman 不完全恢复 9.1 rman 不完全恢复的三个标准模式:基于time.基于scn和基于sequence: 范例1:恢复过去某个时间点误操作,一般使用基于time或scn. 1)环境:有一套全 ...
- sql分页存储过程,带求和、排序
创建存储过程: CREATE PROCEDURE [dbo].[sp_TBTest_Query] ( @PageSize INT, --每页多少条记录 @PageIndex INT = 1, --指定 ...
- Linux实战(4):Centos7升级python
记一笔升级python后产生的问题,并给予解决方案.莫慌看下文: 升级python3 我是直接 yum安装的,当然安装方法有很多,不喜欢此安装方式的可选用其他方式,我再此就不一一解释了.安装方式可不同 ...
- CPF 入门教程 - 绘图(四)
CPF NetCore跨平台UI框架,增加了Vlc支持跨平台播放视频. 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF ...
- defer 延迟调用
1. 延迟调用 defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个 xxx 函数的调用延迟到当前函数执行完后再执行. defer xxx() 这是一个很简单的例子,可以很快帮助 ...
- shellcode生成框架
因为vs编译后自己会生成很多东西,我们稍微配置下 先获取kernel32基址 __declspec(naked) DWORD getKernel32() { __asm { mov eax, fs:[ ...
- 搜索引擎学习(一)初识Lucene
一.Lucene相关基础概念 定义:一个简易的工具包,实现文件搜索的功能,支持中文,关键字,多条件查询,凡是文件名或文件内容包含的都查出来. 数据分类:结构化数据(固定格式或有限长度的数据)和非结构化 ...