一个POSIX多线程程序

5月 6th, 2009 | Posted by | Filed under 程序设计

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.penglixun.com/tech/program/posix_multithreading_program.html

符合POSIX标准的多线程程序,写的比较诡异,玩一玩,纯属为了交操作系统小作业。

#include 
#include 
#include 
#include 
#include 
#include 

#define LOCK pthread_mutex_lock(&myMutex)
#define UNLOCK pthread_mutex_unlock(&myMutex)
#define PRINT(STR, ...) LOCK;fprintf(stderr, STR,  __VA_ARGS__);UNLOCK
#define MAXTHREAD 4

int sum;	//设置一全局变量
pthread_mutex_t myMutex=PTHREAD_MUTEX_INITIALIZER;	//互斥锁
pthread_t myThread[MAXTHREAD];
int thread_stop[MAXTHREAD];

void* Thread_Func	(void *);
void* Thread_Func1(void *);
void* Thread_Func2(void *);
void* Thread_Func3(void *);
void	 Thread_Wait	(int);

void Thread_Create(int n) {
	void (*Func)();
	if(thread_stop[n] != 0){
		thread_stop[n] = 0;
		switch (n) {
		case 0 :	Func = Thread_Func;
					break;
		case 1 :	Func = Thread_Func1;
					break;
		case 2 :	Func = Thread_Func2;
					break;
		case 3 :	Func = Thread_Func3;
					break;		
		};
		if ( pthread_create( &myThread[n], NULL, Func, NULL) ) {	//新建线程
			PRINT("\n线程%d创建失败 !\n", n);
			abort();
		} else {
			PRINT("\n线程%d创建成功 !\n", n);
		};
	} else {
		PRINT("\n线程%d已经创建过 !\n", n);
	}
}

void Thread_Cancel(int n) {
	if(thread_stop[n] != 1){
		thread_stop[n] =1;
		if ( pthread_cancel( myThread[n]) ) {	//新建线程
			PRINT("\n线程%d取消失败 !\n", n);
			abort();
		} else {
			PRINT("\n线程%d取消成功 !\n", n);
		}
	} else {
		PRINT("\n线程%d已经取消过 !\n", n);
	};
}


void *Thread_Func(void *arg) {	//线程1的函数
	while (1){
		char ch = getch();
		switch (ch) {
		case '1' : 	Thread_Create(1);
						break;
		case '2' :	Thread_Create(2);
						break;
		case '3' : 	Thread_Create(3);
						break;
		case '4' : 	Thread_Cancel(1);
						break;
		case '5' : 	Thread_Cancel(2);
						break;
		case '6' : 	Thread_Cancel(3);
						break;
		case 'e' : 	LOCK;
						printf("\nSum = %d\n", sum);
						exit(0);
		}
	}
	return NULL;
}

void *Thread_Func1(void *arg) {	//线程1的函数
	while (1) {
		LOCK;	//互斥锁加锁
			++sum;
		UNLOCK;//互斥锁解锁
		printf("+");
		fflush(stdout);
		Sleep(100);
		if( thread_stop[1] == 1 ){
			pthread_exit(0);
		};
	}
	PRINT("%s", "\n线程1 : 主函数在等我完成任务吗?");
	return NULL;
}

void *Thread_Func2(void *arg) {
	while (1) {
		LOCK;
			++sum;
		UNLOCK;
		printf(".");
		fflush(stdout);
		Sleep(100);
		if( thread_stop[2] == 1 ){
			pthread_exit(0);
		}
	}

	PRINT("%s", "\n线程2 : 主函数在等我完成任务吗?");
	return NULL;
}
void *Thread_Func3(void *arg) {
	while (1) {
		LOCK;
			++sum;
		UNLOCK;
		printf("o");
		fflush(stdout);
		Sleep(100);
		if( thread_stop[3] == 1 ){
			pthread_exit(0);
		}
	}
	PRINT("%s", "\n线程3 : 主函数在等我完成任务吗?");
	return NULL;
}
void Thread_Wait(int n) {
	if ( pthread_join ( myThread[n], NULL ) ) {	//挂起主线程直到所有线程结束
		PRINT("\n线程%d等待失败 !", n);
		abort();
	} else {
		PRINT("\n线程%d等待成功 !", n);
	}
}
int main() {
	for(int i=0; i		
目前还没有任何评论.