Linux下多线程编程之——多线程委托模型
一、多线程:
系统中运行的程序都是一个进程,进程包含一到多个进程,进程执行时需要一定的资源。线程可以是一组指令的集合或特殊的程序段,可以在程序里独立执行,可将其理解为代码运行的上下文,可以将其当作轻量级的进程,主要实现单个程序里执行多个任务。由于进程的创建、切换、调度和销毁时窜在速度慢,内存和资源消耗大,进程中的多线程的创建、切换、调度和销毁比进程轻量多了,多线程编程复杂,调试难,可靠性不高等缺点。总体来说,多线程编程是有效提升程序运行速度的不二选择。
二、委托模型:
将线程分为:主线程和工作线程,先从主线程开始运行,工作线程有主线程根据情况完成工作线程的创建,将创建好的工作线程放入队列中,有工作时,主线程唤醒工作参与工作。如果工作线程产生异常,主线程可以关闭工作线程并开启新的工作线程。
主线程常常由主函数充当,通过pthread_create()函数完成线程的创建,其中:
第一个参数: 指向线程标识符的指针,pthread_t *thread,
第二个参数:设置线程属性,const pthread_attr_t *attr,
第三个参数:线程运行函数的起始地址, void *(*start_routine) (void *),
第四个参数:线程运行函数的参数,参数多于一个时,可以传入结构体指针, void *arg,
三,代码test7_2.c
1 //This is c program code! 2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= += 3 * 文档信息: *** :~/test7_2.c 4 * 版权声明: *** :(魎魍魅魑)MIT 5 * 联络信箱: *** :guochaoxxl@163.com 6 * 创建时间: *** :2020年11月17日的下午04:10 7 * 文档用途: *** :数据结构与算法分析-c语言描述 8 * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl) 9 * 修订时间: *** :2020年第46周 11月17日 星期二 下午04:10 (第322天) 10 * 文件描述: *** :自行添加 11 * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ =+*/ 12 #include <stdio.h> 13 #include <pthread.h> 14 15 void *myComadd(void *iData){ 16 int sum = 0; 17 int *data = (int *)(iData); 18 for(int i = 1; i <= *data; i++){ 19 sum += i; 20 } 21 printf("add result: %d\n", sum); 22 23 return; 24 } 25 26 void *myCommul(void *iData){ 27 int sum = 1; 28 int *data = (int *)(iData); 29 for(int i = 1; i <= *data; i++){ 30 sum *= i; 31 } 32 printf("mul result: %d\n", sum); 33 34 return; 35 } 36 37 int main(int argc, char **argv) 38 { 39 pthread_t threadA; 40 pthread_t threadB; 41 int n = 9; 42 43 pthread_create(&threadA, NULL, myComadd, &n); 44 pthread_create(&threadB, NULL, myCommul, &n); 45 46 pthread_join(threadA, NULL); 47 pthread_join(threadB, NULL); 48 49 return 0; 50 }
程序编译,通过-lpthread添加多线程编程支持:
gcc test7_2.c -o test7_2 -lpthread
结果为:
add result: 45 mul result: 362880
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。