目录
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 |