一个POSIX多线程程序
本文内容遵从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