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 }
时间: 2024-10-20 02:59:42

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

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

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件--其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁.另外,在长时间计算期间挂起线程也可能导致问题. 下面的代码演示了通过休眠来延缓运行

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

挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件--其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁.另外,在长时间计算期间挂起线程也可能导致问题. 下面的代码演示了通过休眠来延缓运行,模拟长时间运行的情况,使线程更可能在不适当的时候被挂起: public class DeprecatedSuspendRe

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

JAVA大数据中高级架构 2018-11-06 14:24:56挂起和恢复线程Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件--其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁.另外,在长时间计算期间挂起线程也可能导致问题. 下面的代码演示了通过休眠来延缓运行,模拟长时间运行的情况,使线程更可能在不适当的时候被挂起: publi

Linux线程编程之信号处理

前言 Linux多线程环境中的信号处理不同于进程的信号处理.一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理. 本文首先介绍信号处理在进程中和线程间的不同,然后描述相应的线程库函数,在此基础上给出一组示例代码,以讨论线程编程中信号处理的细节和注意事项.文中涉及的代码运行环境如下: 本文通过sigwait()调用来“等待”信号,而通过signal()/sigaction()注册的信号处理函数来“捕获”信号,以体现其同步和异步的区别. 一  概念

[转载]Linux 线程实现机制分析

本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是如何看待和解决兼容性和效率这两个问题的. 一.基础知识:线程和进程 按照教科书上的定义,进

Linux 线程与进程,以及通信

http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-id-3025213.html 1.首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.进程是程序在某个数据集上的执行,

linux线程

linux线程私有的部分:每个线程都拥有一个独立的程序计数器,进程栈和一组进程寄存器 linux进程切换时通过TSS段,TSS中的esp0和ss0都是系统初始化设置的,指向进程创建时候,分配的栈空间.当进程切换的时候,在内核态下才进行进程切换,在0.11版本中,当前进程的寄存器被压入当前进程的TSS中,然后利用长跳转指令来到下一个TSS中,把这个TSS中的寄存器数据全给赋给寄存器(用于恢复寄存器)

Linux 线程管理

解析1 LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数的执行过程比较难于理解. pthread_cond_wait()的工作流程如下(以MAN中的EXAMPLE为例):       Consider two shared variables x and y, protected by the mutex mut, and a condition vari-        able cond that is to be

Linux 线程模型的比较:LinuxThreads 与 NPTL

Linux 线程模型的比较:LinuxThreads 与 NPTL 本文参照来源:IBM开发者论坛 前奏:关于POSIX 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945.此标准源于一个大约开始于1985年的项目.POSIX这个名称是由理查德·斯托曼应IEE