多线程

目录

1. Linux下线程概念

2.线程控制

2.1 线程创建

2.2 线程终止

2.3 线程等待

2.4 线程分离

3. 线程安全


1. Linux下线程概念

    在传统操作系统中pcb是一个进程,描述一个程序的运行,还有一个tcp描述实现进程。但是在Linux下使用pcb描述实现了程序调度,并且这些pcb共用一个虚拟地址空间,相较于传统的pcb更加轻量化,因此也把linux下的称为轻量级进程。

  • 一个进程分为多个线程,每个线程都是一个pcb,多个线程(线程组)是一个进程。
  • 进程是资源分配的基本单位
  • 线程是cpu调度的基本单位

    线程间的独有与共享

  • 独有:栈,寄存器,信号屏蔽字,errno,标识符
  • 共享:虚拟地址空间(代码段,数据段相同),文件描述符(文件只用打开一次,大家共用),信号处理方式,工作路径,用户ID,组ID

多线程特点

  • 线程间通信更加灵活(全局变量,函数传参)
  • 线程的创建/销毁成本更低
  • 线程间的调度成本更低

多进程的特点

  • 具有独立性,因此更加稳定,健壮

共同优点

  • CPU密集型程序,IO密集型程序,并行压缩CPU处理/IO等待时间
  • 线程并非越多越好,调度线程也需要成本

2.线程控制

POSIX线程库

  • 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”开头的,要使用这些函数库,要通过引入头文<pthread.h>,链接这些线程函数库时要使用编译器命令的“-lpthread”选项

2.1 线程创建

int pthread_create(pthread_t* tid, pthread_attr_t* attr, void* (*thread_routine)(void* arg), void* arg);

  • tid:线程在虚拟地址空间开辟的线程空间的首地址,是一个获得型参数,用于获取线程ID,通过这个ID可以找到线程的描述信息,进而访问PCB(轻量级进程完成控制)
  • attr:线程属性信息,通常置NULL
  • thread_routine:线程入口函数,创建一个线程就是为了运行这个函数,函数运行完毕,则线程退出。
  • arg:通过线程入口函数,传递给线程的参数。
  • 返回值:0成功,失败返回一个非0值

代码

#include <stdio.h>                                                                                  
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
 
void* thread_start(void* arg)
{
     while(1)
     {
         printf("线程:%s\n", (char*)arg);
         sleep(1);
     }
     return NULL;
}
 
int main()
{
     pthread_t tid;
     char buf[] = "perseverse\n";
     int ret = pthread_create(&tid, NULL, thread_start, (void*)buf);
     if (ret != 0)
     {
         printf("thread create error:%d", ret);
         return -1;
     }
 
     while(1)
     {
         printf("I am main thread\n");
         sleep(1);
     }
 
     return 0;
}                       

makefile

  1 create:create.c                                                                                     
  2     gcc $^ -o $@ -lpthread #pthread
  • 在编译时, 要链接库函数pthread, 不使用l可以增强跨平台性, 两者均可
  • 结果
[test@localhost thread]$ ./create 
I am main thread
线程:perseverse

I am main thread
线程:perseverse

I am main thread
线程:perseverse
^C

使用ps -ef查看进程信息

[test@localhost ~]$  ps -ef | head -n 1 && ps -ef | grep create
UID         PID   PPID  C STIME TTY          TIME CMD
test       5343   2847  0 10:43 pts/0    00:00:00 ./create

 使用 ps -efL 查看轻量级进程信息

UID         PID   PPID    LWP  C NLWP STIME TTY          TIME CMD
test       5343   2847   5343  0    2 10:43 pts/0    00:00:00 ./create
test       5343   2847   5344  0    2 10:43 pts/0    00:00:00 ./create

根据上面的结果, 可以看出, -L的选项是查看轻量级进程信息, 即线程信息
其中

名称 解释
UID user id 用户ID
PID process id 进程ID, 即线程组ID, 是主线程的ID
LWP light weight process or thread. 轻量级进程I
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值