#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h> #include<semaphore.h> void *thread_function(void *arg); pthread_mutex_t work_mutex;/*互斥量,保護工作區(qū)間及額外變量 time_to_exit*/ #define WORK_SIZE 1024 char work_area[WORK_SIZE];/*工作區(qū)*/ int time_to_exit=0; int main() { int res; pthread_t a_thread; void *thread_result; res = pthread_mutex_init(&work_mutex,NULL);//初始化工作區(qū)間 if(res!=0){ perror("Mutex initalization failed"); exit(EXIT_FAILURE); } res = pthread_create(&a_thread,NULL,thread_function,NULL);//創(chuàng)建新線程 if(res!=0){ perror("Thread creation failed"); exit(EXIT_FAILURE); } /* 主線程*/ pthread_mutex_lock(&work_mutex); printf("Input some text,Enter 'end' to finish\n"); while(!time_to_exit){ fgets(work_area,WORK_SIZE,stdin); pthread_mutex_unlock(&work_mutex); while(1){ pthread_mutex_lock(&work_mutex); if(work_area[0]!='\0'){ pthread_mutex_unlock(&work_mutex); sleep(1); }else{ break; } } } pthread_mutex_unlock(&work_mutex); printf("\n Waiting for thread to finish...\n"); res = pthread_join(a_thread,&thread_result); if(res !=0 ){ perror("Thread joined\n"); pthread_mutex_destroy(&work_mutex); exit(EXIT_SUCCESS); } printf("Thread joined\n"); pthread_mutex_destroy(&work_mutex); exit(EXIT_SUCCESS); } // 新線程 void *thread_function(void *arg){ sleep(1); pthread_mutex_lock(&work_mutex); while(strncmp("end",work_area,3)!=0){ printf("You input %d characters\n",strlen(work_area)-1); work_area[0]='\0'; pthread_mutex_unlock(&work_mutex); while(work_area[0]=='\0'){ pthread_mutex_unlock(&work_mutex); sleep(1); pthread_mutex_lock(&work_mutex); } } time_to_exit=1; work_area[0]='\0'; pthread_mutex_unlock(&work_mutex); pthread_exit(0); } ----------------------------------------------------------------- 編 譯運行: $gcc -Wall -lpthread -o test threadsyntest.c $./test 結(jié) 果: |
|