您的位置:首页 > 运维架构 > Linux

linux 线程挂起恢复

2015-04-16 13:03 507 查看
//============================================================================
// Name        : thread.cpp
// Author      : LittleKu
// Version     :
// Copyright   : LittleKu
// Description : thread in C++, Ansi-style
//============================================================================

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

using namespace std;

class Thread {
public:
Thread() {
this->_flag = 0;
this->_threadID = 0;
::pthread_mutex_init(&this->_mutex, NULL);
::pthread_cond_init(&this->_cond, NULL);
}
virtual ~Thread() {
::pthread_mutex_destroy(&this->_mutex);
::pthread_cond_destroy(&this->_cond);
}

bool Start(bool bSuspend = false) {
if (bSuspend)
SuspendThread();

if (this->_threadID == 0)
::pthread_create(&this->_threadID, NULL, _ThreadFunc, this);

return (this->_threadID != 0);
}

void SuspendThread() {
if (this->_flag > 0) {
printf("thread has been suspend\n");
return;
}
__sync_lock_test_and_set((long*) &this->_flag, 1);
}

void Resume() {
if (this->_flag > 0) {
__sync_lock_test_and_set((long*) &this->_flag, 0);

::pthread_mutex_lock(&this->_mutex);
::pthread_cond_broadcast(&this->_cond);
::pthread_mutex_unlock(&this->_mutex);
} else
printf("thread is running\n");
}

virtual void OnRun() {
while (this->_flag <= 0) {
printf("thread running\n");
::usleep(1000 * 1000);
}
}

private:
static void *_ThreadFunc(void *param) {
Thread *pThis = (Thread*) param;
while (true) {
/**< suspend = true*/
if (pThis->_flag > 0) {
printf("thread suspend\n");

::pthread_mutex_lock(&pThis->_mutex);
::pthread_cond_wait(&pThis->_cond, &pThis->_mutex);
::pthread_mutex_unlock(&pThis->_mutex);

} else {
pThis->OnRun();

//pThis->SuspendThread();
}
}
return NULL;
}
private:
pthread_t _threadID;
int _flag;
pthread_cond_t _cond;
pthread_mutex_t _mutex;
};

int main(int argc, char *argv[]) {

char ch;
Thread *t = new Thread;
t->Start(true);

while (1) {
::scanf("%c", &ch);
switch (ch) {
case 's':
t->SuspendThread();
break;
case 'r':
t->Resume();
break;
default:
break;
}
}
delete t;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: