当前位置:首页 > 公众号精选 > 技术让梦想更伟大
[导读]关注、星标公众号,直达精彩内容来源:整理与网络素材1.线程概述线程是轻量级的进程(LWP:lightweightprocess),在Linux环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系...

关注、星标公众号,直达精彩内容



来源:整理与网络素材


1. 线程概述

线程是轻量级的进程(LWP:light weight process),在 Linux 环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。


先从概念上了解一下线程和进程之间的区别:


  1. 进程有自己独立的地址空间,多个线程共用同一个地址空间
  • 线程更加节省系统资源,效率不仅可以保持的,而且能够更高
  • 在一个地址空间中多个线程独享:每个线程都有属于自己的栈区,寄存器 (内核中管理的)
  • 在一个地址空间中多个线程共享:代码段,堆区,全局数据区,打开的文件 (文件描述符表) 都是线程共享的
  1. 线程是程序的最小执行单位,进程是操作系统中最小的资源分配单位
  • 每个进程对应一个虚拟地址空间,一个进程只能抢一个 CPU 时间片
  • 一个地址空间中可以划分出多个线程,在有效的资源基础上,能够抢更多的 CPU 时间片
  1. CPU 的调度和切换:线程的上下文切换比进程要快的多
上下文切换:进程 / 线程分时复用 CPU 时间片,在切换之前会将上一个任务的状态进行保存,下次切换回这个任务的时候,加载这个状态继续运行,任务从保存到再次加载这个过程就是一次上下文切换。


  1. 线程更加廉价,启动速度更快,退出也快,对系统资源的冲击小。
在处理多任务程序的时候使用多线程比使用多进程要更有优势,但是线程并不是越多越好,如何控制线程的个数呢?


  1. 文件 IO 操作:文件 IO 对 CPU 是使用率不高,因此可以分时复用 CPU 时间片,线程的个数 = 2 * CPU 核心数 (效率最高)


  2. 处理复杂的算法 (主要是 CPU 进行运算,压力大),线程的个数 = CPU 的核心数 (效率最高)


2. 创建线程

2.1 线程函数

每一个线程都有一个唯一的线程 ID,ID 类型为 pthread_t,这个 ID 是一个无符号长整形数,如果想要得到当前线程的线程 ID,可以调用如下函数:


pthread_t pthread_self(void); // 返回当前线程的线程ID
在一个进程中调用线程创建函数,就可得到一个子线程,和进程不同,需要给每一个创建出的线程指定一个处理函数,否则这个线程无法工作。


#include
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
// Compile and link with -pthread, 线程库的名字叫pthread, 全名: libpthread.so libptread.a
参数:


  • thread: 传出参数,是无符号长整形数,线程创建成功,会将线程 ID 写入到这个指针指向的内存中
  • attr: 线程的属性,一般情况下使用默认属性即可,写 NULL
  • start_routine: 函数指针,创建出的子线程的处理动作,也就是该函数在子线程中执行。
  • arg: 作为实参传递到 start_routine 指针指向的函数内部
返回值:线程创建成功返回 0,创建失败返回对应的错误号


2.2 创建线程

下面是创建线程的示例代码,在创建过程中一定要保证编写的线程函数与规定的函数指针类型一致:void *(*start_routine) (void *):


// pthread_create.c
#include 
#include 
#include 
#include 
#include

// 子线程的处理代码
void* working(void* arg)
{
printf("我是子线程, 线程ID: %ld\n", pthread_self());
for(int i=0; i<9; i)
{
printf("child == i: = %d\n", i);
}
return NULL;
}

int main()
{
// 1. 创建一个子线程
pthread_t tid;
pthread_create(
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

助力顶级特效公司Wētā FX构建云上工作室,支持《阿凡达:水之道》高达33亿渲染线程小时的云上制作任务 北京2022年12月19日 /美通社/ -- 近期,时隔十三年重返大荧幕的阿凡达系列电影《阿凡达:水之道》在全球...

关键字: 亚马逊 线程 云计算 数字化

摩尔线程专注于研发设计全功能GPU芯片及相关产品,支持3D高速图形渲染、AI训练推理加速、超高清视频编解码和高性能科学计算等多种组合工作负载,能够为中国科技生态合作伙伴提供计算加速能力。

关键字: 摩尔 线程 GPU

作为丹纳赫生命科学平台旗下的重要运营公司,Pall颇尔公司将进一步加大在华投资,导入更高芯片线程的产线及技术,强化对国内客户的供应链稳定性。Pall颇尔中国已落实1100万美元的产能扩建投资,以进一步拓建北京工厂的半导体...

关键字: 半导体 供应链 微电子 线程

(全球TMT2021年12月16日讯)摩尔线程与浪潮在京签署元脑战略合作协议。摩尔线程与浪潮将发挥各自在技术、生态和产业等方面的领先优势,基于创新算力芯片和元脑生态平台展开多维和深度合作,联手开发领先的人工智能行业解决...

关键字: 线程

目录Java线程与OS线程的区别与关联JNI的作用JNIEnv和JavaVM是啥JNI中数据是如何传递的Java线程与Native(OS)线程的区别联系:Java线程其实是一层OS线程的封装,本质上就是OS线程。【以前版...

关键字: Android NI 线程 LOADER

线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题。

关键字: 线程 进程 JAVA

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

关键字: 线程 进程 控制流

摘要:介绍了地基沉降远程数据采集系统服务器端软件的设计与实现方法。该软件能够并发处理多个远程客户端传送过来的数据,并将数据保存到数据库中,同时采用B/S架构对采集的数据进行管理和分析,从而实现对地基沉降远程采集数据的实时...

关键字: 地基沉降 远程数据采集 软件系统 线程

昨天我们用IntelI9的10核,每个核2个threads的机器跑了内核的编译:超线程SMT究竟可以快多少?今天,我换一台机器,采用AMDRyzen。 默认情况16核,每个核2个threads,共32个CPUs:下面编译...

关键字: zen 线程 SMT

众所周知,STL容器不是线程安全的。对于vector,即使写方(生产者)是单线程写入,但是并发读的时候,由于潜在的内存重新申请和对象复制问题,会导致读方(消费者)的迭代器失效。实际表现也就是招致了coredump。另外一...

关键字: 线程 ST
关闭
关闭