LWP

简介

linux中没有线程的概念,线程在linux中叫做轻量级进程(light weight process)
线程是多任务并发执行的另一种解决方案。相比于进程的优势在于,分配的资源少,多个线程共享进程的资源,并且其调度效率要高于进程。线程尤其适用于高并发量(尤其是对于web的访问,对于进程而言只能有个几十几百的),短小的任务的并发运行。
线程实际上是应用层的概念,在linux内核中,所有的调度实体都被称为任务(task),他们之间的区别是:有些任务自己拥有一套完整的资源,而有写任务彼此之间共享一套资源。
线程间共享共享代码区、堆区、数据区。

如上图所示,左边是一个标准进程,它拥有自己一套完整的资源–包括内存空间、文件、信号挂起队列等等,这些资源全部由PCB(即内核结构体task_struct)统一管理,这整套数据结构以及他们的动态变化就是一个进程。对于右边,可以看到有两个PCB结构体共享了很多资源,而一个PCB对应系统中的一个任务,是系统调度器的调度对象,系统在调度的时候并不关心这些PCB究竟是独立拥有一套资源还是跟别人共享,因此右边的等多个调度实体(线程)的进程就比单个调度实体的进程可以获得更多的CPU资源来管理和操作他们的资源。

应用举例

下载工具:对于一个下载任务可以使用多线程。
服务器:高并发的客户端请求。
对于我们的LCD,我们可以开启一个进程,然后在一个进程内跑多个线程,这样就可以对于不同的地方有不同的响应。

线程的API

安装线程手册

sudo apt-get update
sudo apt-get install manpages-posix-dev
1
2
1
2
创建线程:

线程例程指的是:如果线程创建成功,那么该线程就会立即去执行的函数
POSIX线程库的所有API对返回值的处理原则都是一致的,成功返回0,失败返回错误码errno
如果attr是NULL的话那么就会创建一个标准的线程

获取线程ID:

pthread_t pthread_self(void);
1
1
设置或获取线程属性

一条线程如果是可接合的,意味着这条线程在退出时不会自动释放自身资源,而会成为僵尸线程,同时意味着该线程的退出值可以被其他线程获取,因此,如果不需要某条线程的退出值的话,那么最好将线程设置为分离状态,以保证线程不会成为僵尸线程

线程属性变量的使用步骤是

1,定义线程属性变量,并且使用pthread_attr_init( )初始化。
2,使用 pthread_attr_setXXX( )来设置相关的属性。
3,使用该线程属性变量创建相应的线程。
4,使用 pthread_attr_destroy( )销毁该线程属性变量。

创建一个分离属性的线程

/*************************************************************************
> File Name: 04_detach.c
> Author: Xianghao Jia
> mail: [email protected]
> Created Time: Mon 18 Nov 2019 06:20:41 AM PST
************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pthread.h>

void *routine(void *arg)
{
printf(“hello\n”);
// 由于已分离,该线程退出后会自动释放资源
pthread_exit(NULL);
}

int main(int argc, char ** argv)
{
pthread_t tid;
// 初始化一个属性变量,并将分离属性加入该变量
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// 用该属性变量产生一个新线程
pthread_create(&tid, &attr, routine, NULL);

// 主线程暂停,否则return语句会导致整个进程退出
pause();
retur

线程调度

如果你想给一个线程设置调度方面的属性时,必须将线程的inheritched设置为PTHREAD_EXPLICIT_SCHED。

猜你喜欢

转载自blog.csdn.net/u014162993/article/details/112727382
LWP