⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多线程函数1.txt

📁 本人搜集的Linux学习文档
💻 TXT
字号:
//以下代码均来自《Linux C 编程》一书,m=%w'G6络0专Y-
zy\@g育垠^P业ZFq
本人对其中代码做了一些改进,使之更有利于系统学习GNU C标准库中Pthread。

//特别注意:makefile中的编译选项中一定要包含-lpthread(即连接pthread库)

makefile:

demo:demo1.o
    gcc -o demo demo1.o -lpthread
    
demo1.o:demo1.c    
    gcc -c demo1.c
    
clean:
    rm demo demo1.c    


demo1.c:

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

//used in test1
pthread_once_t once=PTHREAD_ONCE_INIT; 

//used in test2
pthread_mutex_t mutex; 
pthread_cond_t cond;

//used in test3
pthread_key_t key;  

void once_run(void) 
{ 
  printf("once_run in thread %d\n",pthread_self()); 
} 

void * child1(void *arg) 
{ 
  int tid=pthread_self(); 
  printf("thread child1 %d enter\n",tid); 
  pthread_once(&once,once_run); 
  //sleep(3);
  printf("thread child1 %d returns\n",tid); 
} 

void * child2(void *arg) 
{ 
  int tid=pthread_self(); 
  printf("thread child2 %d enter\n",tid); 
  pthread_once(&once,once_run); 
  //sleep(3);
  printf("thread child2 %d returns\n",tid); 
} 

void * child3(void *arg) 
{ 
   pthread_cleanup_push(pthread_mutex_unlock,&mutex); /* comment 1 */ 
   while(1){ 
      printf("thread child3 get running \n"); 
      printf("thread child3 pthread_mutex_lock returns %d\n", 
      pthread_mutex_lock(&mutex)); 
      pthread_cond_wait(&cond,&mutex); 
      printf("thread child3 condition applied\n"); 
      pthread_mutex_unlock(&mutex); 
      sleep(5); 
   }  
   pthread_cleanup_pop(0); /* comment 2 */ 
} 

void *child4(void *arg) 
{ 
   while(1){ 
      sleep(3); /* comment 3 */ 
      printf("thread child4 get running.\n"); 
      printf("thread child4 pthread_mutex_lock returns %d\n", 
      pthread_mutex_lock(&mutex)); 
      pthread_cond_wait(&cond,&mutex); 
      printf("thread child4 condition applied\n"); 
      pthread_mutex_unlock(&mutex); 
      sleep(1); 
   } 
} 

void echomsg(int t) 
{ 
   printf("destructor excuted in thread %d,param=%d\n",pthread_self(),t); 
} 

void * child5(void *arg) 
{ 
    int tid=pthread_self(); 
    printf("thread child5 %d enter\n",tid); 
    pthread_setspecific(key,(void *)tid); 
    sleep(2); 
    printf("thread child5 %d returns %d\n",tid,pthread_getspecific(key)); 
    sleep(5); 
} 

void * child6(void *arg) 
{ 
    int tid=pthread_self(); 
    printf("thread child6 %d enter\n",tid); 
    pthread_setspecific(key,(void *)tid); 
    sleep(1); 
    printf("thread child6 %d returns %d\n",tid,pthread_getspecific(key)); 
    sleep(5); 
} 

int main(void) 
{ 
  int tid1,tid2,tid3,tid4,tid5,tid6; 
  printf("hello\n"); 
  
  printf("\n\n\n");
  
  //test1:pthread_once,pthread_self
  pthread_create(&tid1,NULL,child1,NULL); 
  pthread_create(&tid2,NULL,child2,NULL); 
  pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);
  
  printf("\n\n\n");

  //test3:pthread_key_create,pthread_setspecific,pthread_getspecific
  pthread_key_create(&key,echomsg); 
  pthread_create(&tid5,NULL,child5,NULL); 
  pthread_create(&tid6,NULL,child6,NULL); 
  pthread_join(tid5,NULL);
  pthread_join(tid6,NULL);  
  pthread_key_delete(key);   
  
  printf("\n\n\n");
    
  //test2:pthread_mutex_lock,pthread_mutex_unlock,pthread_cond_wait,pthread_cleanup_pop \
          pthread_cond_signal,pthread_exit
  pthread_create(&tid3,NULL,child3,NULL); 
  pthread_create(&tid4,NULL,child4,NULL); 
  pthread_join(tid3,NULL);
  pthread_join(tid4,NULL);
  do{ 
     sleep(2); /* comment 4 */ 
     pthread_cancel(tid3); /* comment 5 */ 
     sleep(2); /* comment 6 */ 
     pthread_cond_signal(&cond); 
  }while(1); 
  sleep(100); 
  pthread_exit(0); 
  
  printf("\n\n\n");
  
  printf("main thread exit\n"); 
  return 0; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -