pthread_t:用来定义一个线程类型的变量
用法 pthread_t x1;
pthread_create:建立线程,它有4个参数
pthread_create(&temp, NULL, print_b, NULL);
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。
pthread_join:用来等待一个线程的结束,也可以理解为线程开始
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
pthread_join(threadPool[i], &result);
pthread_exit:一个线程的结束有两种途径,一种函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现
下面代码是C语言多(3个及以上)线程(建立线程池)实现:
就像生产者和消费者问题一样,需要多个生产者和消费者。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#include <stdio.h> #include <pthread.h> #include <windows.h> void * print_a(void *a){ int i; for(i = 0;i < 10; i++){ Sleep(1000); printf("aa\n"); } return NULL; }//1号进程 void * print_b(void *b){ int i; for(i=0;i<20;i++){ Sleep(1000); printf("bb\n"); } return NULL; }//2号进程 int main() { int aNum=5; int bNum=3; pthread_t threadPool[aNum+bNum];//创建一个线程池,大小为aNum+bNum int i; for(i = 0; i < aNum; i++){ pthread_t temp; if(pthread_create(&temp, NULL, print_a, NULL) == -1){ printf("ERROR"); exit(1); } threadPool[i] = temp; }//创建a进程放入线程池 for(i = 0; i < bNum; i++){ pthread_t temp; if(pthread_create(&temp, NULL, print_b, NULL) == -1){ printf("ERROR"); exit(1); } threadPool[i+aNum] = temp; }//创建b进程放入线程池 void * result; for(i = 0; i < aNum+bNum; i++){ if(pthread_join(threadPool[i], &result) == -1){ printf("fail to recollect\n"); exit(1); } }//运行线程池 return 0; } |
结果:
优秀