C语言创建多线程
来源:互联网 发布:夜神模拟器清理数据 编辑:程序博客网 时间:2024/05/16 16:17
线程是计算机中独立运行的最小单位。每个线程占用的CPU时间是由系统分配的,因此可以把线程看成操作系统分配CPU时间的基本单位。每个线程只有在系统分配给它的时间片内才能取得CPU控制权,执行线程中的代码。
Linux操作系统在一个进程内生成多个线程。多线程和多进程相比,拥有以下优点:
(1)进程都有独立的地址空间,创建新进程要耗费时间为期分配系统资源,而线程共享进程的地址空间,所以创建线程花费的时间要少得多。
(2)系统调度方面,由于进程地址空间独立而线程共享地址空间,所以线程间的切换速度要远远快过进程间的切换速度。
(3)通信机制方面,进程间的数据空间相互独立,彼此通信要以专门的通信方式进行,且必须经过操作系统。而多线程共享共享数据空间,一个线程的数据可以直接提供给其他线程使用,而不必经过操作系统。因此,线程间的通信更加方便省时。
虽然线程在进程内部共享地址空间、打开的文件描述符等资源。但是线程也有其私有的数据信息,包括:
(1)线程ID:每个线程都由一个唯一的线程号。
(2)寄存器(包括程序计数器和堆栈指针)。
(3)堆栈
(4)信号掩码
(5)优先级
(6)线程私有的存储空间
Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a。
在主线程里创建线程,程序就会在创建线程的地方产生分支,变成两个程序执行。这似乎和多进程一样,其实不然。子进程时通过拷贝父进程的地址空间来实现的;而线程与进程内的其他线程共享程序代码,一段代码可以同时被多个线程执行。
线程的创建通过函数pthread_create来完成,声明如下:
#include <pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t * attr, void* (*start_routine)(void *),void *arg);
- thread: 是一个指针,线程创建成功时,用以返回创建的线程ID
- attr:指定线程属性,NULL表示使用默认属性
- start_routine:函数指针,指向线程创建后要调用的函数。这个被线程调用的函数也称为线程函数。
- arg:该参数指向传递给线程函数的参数。
线程的创建过程:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>int * thread(void * arg){pthread_t newthid;newthid = pthread_self();printf("this is a new thread, thread ID = %d\n", newthid);return NULL;}int main(void){pthread_t thid;printf("main thread ,ID is %d\n",pthread_self());if(pthread_create(&thid, NULL, (void *)thread, NULL) != 0) {printf("thread creation failed\n");exit(1);}exit(0);}
运行结果:
- C语言多线程创建
- C语言创建多线程
- C语言实现的创建多线程
- c语言,用APi初次创建多线程
- 多线程~~简单的线程创建,C语言实现
- linux下C语言多线程(第一篇)创建线程
- 多线程~~简单的线程创建,C语言实现
- C语言多线程基础-01-线程的创建与销毁
- Objecttive-C 创建多线程
- c语言多线程编程
- c 语言多线程
- C语言多线程编程
- C语言多线程开发
- C语言多线程
- C语言多线程
- C语言多线程
- C语言多线程
- C语言多线程
- 变分贝叶斯推断(Variational Bayes Inference)简介
- tensorflow中的关键字global_step使用
- poll系统调用
- 数据结构读书笔记(二)——红黑树
- 机房重构之遇见问题
- C语言创建多线程
- 疯狂Activiti6.0连载(22)流程存储Web Service
- 素数求解
- cookie
- 感知器和神经网络训练(公式推导及C++实现)
- Neo4j Causal Cluster 概要
- HDOJ1157Who's in the Middle
- 词向量和语言模型阅读笔记
- cell的重用原理