线程

线程:是进程的执行分支。线程是子进程内部运行的,这里的内部说的是,初始进程创建的地址空间。但是Linux下并没有真正意义上的线程,只有进程模拟的线程,因为Linux并没有给线程一个专门的结构体,而且,CPU也不需要区分进程和县城,他只需执行就行了。所以,线程又叫轻量级进程

线程的特点

在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有以下属性。
  

1、轻型实体
  线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。
  线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括以下信息:
  (1)线程状态。
  (2)当线程不运行时,被保存的现场资源。
  (3)一组执行堆栈。
  (4)存放每个线程的局部变量主存区。
  (5)访问同一个进程中的主存和其它资源。
  用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。

  2、独立调度和分派的基本单位。
  在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。

  3、可并发执行。
  在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。

  4、共享进程资源。
  在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

线程和进程的区别与联系:

区别:

1、地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

2、通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

3、调度和切换:线程上下文切换比进程上下文切换要快得多。

4、在多线程OS中,进程不是一个可执行的实体。

各线程共享以下进程资源和环境:

1、文件描述符表

2、 每种信号的处理方式(SIG_IGN、SIG_DFL或者⾃自定义的信号处理函数)

3、当前工作目录

4、 用户id和组id

私有资源:

1、线程id

2、上下文,包括各种寄存器的值、程序计数器和栈指针

3、栈空间

4、errno变量

5、信号屏蔽字

6、调度优先级

线程的创建

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 
  5 //create thread
  6 void* thread_run(void *arg)
  7 {
  8     printf("new thread-> thraed id:%u,pid is:%d\n",pthread_self(),getpid());
  9     sleep(1);
 10 
 11     pthread_exit((void*)1); //finish thread;
 12     //exit(1);//finish process
 13     //return (void*)1;//finish thread or process
 14 }
 15 
 16 int main()
 17 {
 18     pthread_t tid;
 19     pthread_create(&tid,NULL,thread_run,NULL);
 20 
 21     pthread_cancel(tid);
 22     while(1)
 23     {
 24         printf("main thread->  thread is : %u  pid : %d\n", pthread_self(), getpid());
 25         sleep(1);
 26     }
 27 
 28     return 0;
 29 }

看一下运行结果:

这里写图片描述

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 
  5 void* thread_run(void *_val)
  6 {
  7     pthread_detach(pthread_self());
  8     printf("%s\n",(char*)_val);
  9     return NULL;
 10 }
 11 
 12 int main()
 13 {
 14     pthread_t tid;
 15     if(pthread_create(&tid,NULL,thread_run,"new thread run...")!=0)
 16     {
 17         perror("pthread_create");
 18         return -1;//error numble
 19     }
 20 
 21     sleep(1);
 22     if(pthread_join(tid,NULL)==0)
 23     {
 24         printf("thread wait success!\n");
 25         return 0;
 26     }
 27     else
 28     {
 29         printf("thread wait failed!\n");
 30         return 1;
 31     }
 32 
 33 }

这里写图片描述

最后说一点:

查看线程的命令是:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值