高级保镖:linux 线程同步实例

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 09:29:44
#include

#include
#include
#include
#include

void *thread_function(void *arg);
pthread_mutex_t work_mutex;/*互斥量,保护工作区间及额外变量 time_to_exit*/

#define WORK_SIZE 1024
char work_area[WORK_SIZE];/*工作区*/
int time_to_exit=0;

int main()
{
    int res;
    pthread_t a_thread;
 void *thread_result;
 res = pthread_mutex_init(&work_mutex,NULL);//初始化工作区间
 if(res!=0){
  perror("Mutex initalization  failed");
  exit(EXIT_FAILURE);
 }
 res = pthread_create(&a_thread,NULL,thread_function,NULL);//创建新线程
 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

结果: