【Linux】下的线程详解

来源:互联网 发布:tensorflow车牌识别 编辑:程序博客网 时间:2024/05/20 05:03
线程的概念:
是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是行程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并行多个线程,每条线程并行执行不同的任务。
线程的特点:
1、一个进程可以产生多个线程,线程也可以产生另一个线程;
2、一个进程里的所有线程共享该进程独有的虚拟内存地址空间以达到共享内存,这是进程之间做不到的;
3、一个线程在使用某些某些共享内存时,其他内存必须等待,当然也可能是能供给固定数目的线程,当多余该数目时也需要等待;
4、为防止多个线程同步读写某一块内存,产生了锁机制。对于单一进程情况,产生互斥锁即先到先使用,后一个需要等待前者开锁;对于固定数目情况产生信号量机制,可引入固定数目的钥匙,进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了;
线程和进程的区别:
1、 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2、 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3、 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
4、 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
5、 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。

 线程的代码的实现:

线程的创建:

#include<stdio.h>#include<stdlib.h>#include<pthread.h>void *Thread_run(){printf("新线程跑起来了:pid->%d,tid->%d",getpid(),pthread_self());return NULL;}int main(){pthread_t tid;int ret=pthread_create(&tid,Thread_run,NULL);if(ret!=0){perror("pthread_creat");return -1;}printf("主线程跑起来了:pid->%d,tid->%d",getpid(),pthread_self());sleep(0);return 0;}
线程的终止:

#include<stdio.h>#include<stdlib.h>#include<pthread.h>void* Thread1(void* _val){printf("线程2跑起来了\n");return(void*)1;}void* thread2(void* _val){printf("线程2退出了\n");pthread_exit((void*)2);}void* thread3(void*_val){while(1){printf("线程3正在运行,请等待\n");sleep(1);}return NULL;}int main(){pthread_t tid;void* ret;pthread_create(tid,NULL,thread1,NULL);pthread_join(tid,&ret);printf("线程返回了,线程是:%u,返回码是:%d\n",(unsigned long)tid,(int)ret);pthread_creat(&tid,NULL,thread2,NULL);pthread_join(tid,&ret);printf("线程返回了,线程是:%u,退出码是:%d\n",(unsigned long)tid,(int)ret);pthread_creat(&tid,NULL,thread3,NULL);sleep(3);pthread_cancle(tid);pthread_join(tid,&ret);printf("线程返回了,线程是:%u,取消码是:%d\n",(unsigned long)tid,(int)ret);return 0;}



原创粉丝点击