0
点赞
收藏
分享

微信扫一扫

【校招 --阶段一 系统编程】线程概念及线程创建

最不爱吃鱼 2022-03-11 阅读 70

一 线程是什么?

示意图如下:
在这里插入图片描述

创建一个进程首先创建他所与需要的所有数据结构包括PCB(task_struct),地址空间等,还为他开辟物理内存包括代码区和数据区接着将物理内存和地址空间通过页表映射起来。
创建一个进程是一个创建许多东西的过程,申请了很多资源。而且过程很复杂,那么怎么简化呢?
那么

那么多创建一些PCB指向同一个地址空间,将代码分成多个代码块,分配给控制块,当cpu事多核的就能执行了,每一个task_struct是一个执行流。
内核观点:进程是一个系统承担的基本实体。
线程:调度的简称单位,线程是进程内部的一条执行流。(线程在进程的地址空间内运行)
进程:线程=1:n
LInux中没有真正意味上的线程,线程是用进程模拟的。轻量级进程。
那么线程到底是什么?

在这里插入图片描述
linux进程vs线程

进程的多个线程共享 同一地址空间,因此代码区和数据区都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

二 线程控制

1 创建线程

传统的一些函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误。
pthreads函数出错时不会设置全局变量errno(而大部分其他POSIX函数会这样做)。而是将错误代码通
过返回值返回
pthreads同样也提供了线程内的errno变量,以支持其它使用errno的代码。对于pthreads函数的错误,
建议通过返回值业判定,因为读取返回值要比读取线程内的errno变量的开销更小

测试代码:

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
using namespace std;
void *thread_run(void *rid){
while(1){

cout<<"I am"<<(char*)rid<<"pid"<<getpid()<<endl;
sleep(1);
}


}
 int main(){
pthread_t tid;
pthread_create(&tid,NULL,thread_run,(void *)"thread1");
while(1){
cout<<"I am main thread pid:"<<getpid()<<endl;
sleep(1);
}
return 9;
}

在这里插入图片描述
在这里插入图片描述
可以看出一个程序有两个个线程但是线程同属于一个PID也就是同属于一个进程,但是他们的LWP也就是轻量级进程id不同,所以两个线程是不同的。
那么LWP和pid是什么关系?
LWP是对线程的标识作用,不同的线程应该有不同的LWP。PID标识他们属于一个进程。

在这里插入图片描述
2 线程ID

#include<iostream>
#include<iomanip>
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
using namespace std;
void *thread_run(void *rid){
while(1){

cout<<"I am "<<(char*)rid<<"pid"<<getpid()<<"线程id"<<hex<<pthread_self()<<endl;
sleep(1);
}


}
 int main(){
pthread_t tid;
pthread_create(&tid,NULL,thread_run,(void *)"thread1");
while(1){
cout<<"I am main thread pid:"<<getpid()<<"线程id:"<<hex<<pthread_self()<<endl;
sleep(1);
}
return 9;
}

在这里插入图片描述
结果可以看出主线程和线程一的线程id不同,但是线程id特别像一个地址。
在这里插入图片描述

在这里插入图片描述

这个程序是依赖线程库承担的是对线程的管理工作,所有的动态库在运行时要加载到共享区,pthread库中有管理线程的 (描述线程的struct_pthread)所有描述线程的数据结构是同一中结构体,所以可以用数组的显示将他们组织起来。线程id是每一个线程在库当中的对应线程控制块struct_pthread的起始地址。

举报

相关推荐

0 条评论