天天看點

多程序和多線程程式設計

1、多程序程式設計

[cpp]  view plain copy

  1. #include <stdlib.h>  
  2. #include <sys/types.h>  
  3. #include <unistd.h>  
  4. int main()  
  5. {  
  6.     pid_t child_pid;  
  7.     child_pid = fork();  
  8.     if(child_pid == 0)  
  9.     {  
  10.         printf("child pid\n");  
  11.         exit(0);  
  12.     }  
  13.     else  
  14.     {  
  15.         printf("father pid\n");  
  16.         sleep(60);  
  17.     }  
  18.     return 0;  
  19. }  

2、多線程程式設計

[cpp]  view plain copy

  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. struct char_print_params  
  4. {  
  5.     char character;  
  6.     int count;  
  7. };  
  8. void *char_print(void *parameters)  
  9. {  
  10.     struct char_print_params *p = (struct char_print_params *)parameters;  
  11.     int i;  
  12.     for(i = 0; i < p->count; i++)  
  13.     {  
  14.         fputc(p->character,stderr);  
  15.     }  
  16.     return NULL;  
  17. }  
  18. int main()  
  19. {  
  20.     pthread_t thread1_id;  
  21.     pthread_t thread2_id;  
  22.     struct char_print_params thread1_args;  
  23.     struct char_print_params thread2_args;  
  24.     thread1_args.character = 'x';  
  25.     thread1_args.count = 3000;  
  26.     pthread_create(&thread1_id, NULL, &char_print, &thread1_args);  
  27.     thread2_args.character = 'o';  
  28.     thread2_args.count = 2000;  
  29.     pthread_create(&thread2_id, NULL, &char_print, &thread2_args);  
  30.     pthread_join(thread1_id, NULL);  
  31.     pthread_join(thread2_id, NULL);  
  32.     return 0;  
  33. }  

 3、線程同步與互斥

1)、互斥

[cpp]  view plain copy

  1. pthread_mutex_t mutex;  
  2. pthread_mutex_init(&mutex, NULL);  
  3. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  
  4. pthread_mutex_lock(&mutex);  
  5. thread_flag = value;  
  6. pthread_mutex_unlock(&mutex);  

2)、條件變量

[cpp]  view plain copy

  1. int thread_flag = 0;  
  2. pthread_mutex_t mutex;  
  3. pthread_cond_t thread_flag_cv;\  
  4. void init_flag()  
  5. {  
  6.     pthread_mutex_init(&mutex, NULL);  
  7.     pthread_cond_init(&thread_flag_cv, NULL);  
  8.     thread_flag = 0;  
  9. }  
  10. void *thread_function(void *thread_flag)  
  11. {  
  12.     while(1)  
  13.     {  
  14.         pthread_mutex_lock(&mutex);  
  15.         while(thread_flag != 0 )  
  16.         {  
  17.             pthread_cond_wait(&thread_flag_cv, &mutex);  
  18.         }  
  19.         pthread_mutex_unlock(&mutex);  
  20.         do_work();  
  21.     }  
  22.     return NULL;  
  23. }  
  24. void set_thread_flag(int flag_value)  
  25. {  
  26.     pthread_mutex_lock(&mutex);  
  27.     thread_flag = flag_value;  
  28.     pthread_cond_signal(&thread_flag_cv);  
  29.     pthread_mutex_unlock(&mutex);  
  30. }