使用Pthread模拟线程开始,暂停,停止的过程

第一次点击开始,之后在暂停和继续两种情况转换,随时都可以停止线程。

参考 http://bbs.csdn.net/topics/390321574

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

enum PthreadStatus
{
	start, pause, stop
};

typedef struct PthreadData
{
	int thread_status;
	pthread_mutex_t mutex;
	pthread_cond_t work_cond;
	pthread_cond_t main_cond;
} PthreadData;

void PthreadPause(void *data)
{
	PthreadData *user_data = (PthreadData*) data;
	user_data->thread_status = pause;
	pthread_mutex_lock(&user_data->mutex);
	pthread_cond_wait(&user_data->main_cond, &user_data->mutex);
	pthread_mutex_unlock(&user_data->mutex);
}

void PthreadResume(void *data)
{
	PthreadData *user_data = (PthreadData*) data;
	user_data->thread_status = start;
	pthread_mutex_lock(&user_data->mutex);
	pthread_cond_signal(&user_data->work_cond);
	pthread_cond_wait(&user_data->main_cond, &user_data->mutex);
	pthread_mutex_unlock(&user_data->mutex);
}

void PthreadStop(void *data)
{
	PthreadData *user_data = (PthreadData*) data;
	user_data->thread_status = stop;
	pthread_mutex_lock(&user_data->mutex);
	pthread_cond_signal(&user_data->work_cond);
	pthread_cond_wait(&user_data->main_cond, &user_data->mutex);
	pthread_mutex_unlock(&user_data->mutex);
}

void *PthreadFunc(void *data)
{
	PthreadData *user_data = (PthreadData*) data;
	user_data->thread_status = start;
	while (true)
	{
		printf("working\n");
		if (user_data->thread_status == pause)
		{
			printf("The thread paused!");
			pthread_mutex_lock(&user_data->mutex);
			pthread_cond_signal(&user_data->main_cond);
			pthread_cond_wait(&user_data->work_cond, &user_data->mutex);
			pthread_mutex_unlock(&user_data->mutex);
			if (user_data->thread_status == start)
			{
				pthread_cond_signal(&user_data->main_cond);
			}
			if (user_data->thread_status == stop)
			{
				printf("The thread stopped!");
				break;
			}
		}
		else if (user_data->thread_status == stop)
		{
			printf("The thread stopped!");
			break;
		}
		Sleep(500);
	}
	pthread_cond_signal(&user_data->main_cond);
	return NULL;
}

void PthreadCreate(void *data)
{
	pthread_t thread;
	pthread_create(&thread, NULL, PthreadFunc, data);
}

int main()
{
	PthreadData *user_data = (PthreadData*) malloc(sizeof(PthreadData));
	memset(user_data, 0, sizeof(user_data));
	user_data->mutex = PTHREAD_MUTEX_INITIALIZER;
	user_data->main_cond = PTHREAD_COND_INITIALIZER;
	user_data->work_cond = PTHREAD_COND_INITIALIZER;
	user_data->thread_status = stop;
	printf("模拟线程: \n");
	printf("[s]第一次开始扫描,点击变成暂停扫描,再点击就是继续扫描\n[c]取消扫描\n[q]退出\n");

	while (true)
	{
		int i = getchar();
		if (i == 's')
		{
			if (user_data->thread_status == stop)
			{
				PthreadCreate(user_data);
			}
			else if (user_data->thread_status == start)
			{
				PthreadPause(user_data);
			}
			else if (user_data->thread_status == pause)
			{
				PthreadResume(user_data);
			}
		}
		else if (i == 'c')
		{
			if (user_data->thread_status == stop)
			{
				printf("The thread is already stoped!\n");
				continue;
			}
			PthreadStop(user_data);
		}
		else if (i == 'q')
		{
			printf("Quit!\n");
			break;
		}
	}
	free(user_data);
	return 0;
}


你可能感兴趣的:(使用Pthread模拟线程开始,暂停,停止的过程)