首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Linux】多线程 --- 线程概念 控制 封装

3.初步认识原生线程库(在linux环境,C++11线程库底层封装了POSIX线程库) 1....所以,在Windows平台上,C++11的线程库底层封装了Windows线程库,而在Linux平台上,它底层封装了POSIX线程库(pthread)。...下面代码就是C++11形式的线程管理代码,这段代码的好处就是它可以跨平台运行,无论是在linux还是在windows环境下这段代码都可以跑,因为C++11的线程库底层封装了各个操作系统的线程库实现,这使得我们能够通过...这种局部存储是介于全局变量和局部变量之间的一种线程特有的存储方案! 三、线程封装(面向对象) 1.组件式的封装出一个线程类(像C++11线程库那样去管理线程) 1....我们并不想暴露出线程创建,终止,等待,分离,获取线程id等POSIX线程库的接口,我们也想像C++11那样通过面向对象的方式来玩,所以接下来我们将POSIX线程库的接口做一下封装,同样能实现像C++11

1.5K30

【Linux】:线程库简单封装

之前我们在这篇博客 里面已经学习了关于线程概念及控制的相关内容,这篇博客主要是关于实现一个线程库的封装,完成对线程的创建、管理和销毁的基本功能 在书写封装库之前,我们先写对应的 Makefile...两种解决办法: ① 把 Rountine 写到类外,但是不支持这样做,因为我们就是要做封装 ② 就是加一个 static 来去掉 this 指针 因此: pthread_create 需要一个全局函数或静态成员函数...封装与局部性: 将 func_t 定义在类内部,保持了类内部的一致性和封装性。每个类实例都可以通过该类型别名来引用线程回调函数类型,避免了外部暴露太多实现细节。...类外部定义类型别名虽然也能使用,但会打破类的封装,增加不必要的复杂性。...共勉 【*★,°*:.☆( ̄▽ ̄)/$:*.°★* 】那么本篇到此就结束啦,如果有不懂 和 发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【Linux】的内容,请持续关注我 !!

7510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】线程池封装与介绍

    线程池介绍   之前我们实现了线程、互斥量、条件变量以及日志的封装,现在我们可以基于以上内容来封装一个线程池。   线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。...而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。...线程池的种类: 创建固定数量线程池,循环从任务队列中获取任务对象,获取到任务对象后,执行任务对象中的任务接口; 浮动线程池,其他同上。 此处,我们选择固定线程个数的线程池。 2....线程池封装 首先我们需要包含需要的头文件以及命名空间,线程池类中成员变量需要一把锁、条件变量、条件变量下等待的线程个数、存放线程的数组、线程总个数、存放任务的任务队列以及线程池是否在运行的状态表示: #...sleep(5); ThreadPool::GetInstance()->Wait(); return 0; } 结果如下: tutu@hecs-16648:~/linux

    5510

    Linux:多线程(一.Linux线程概念、线程控制——创建、等待、退出、分离,封装一下线程)

    Linux线程概念 1.1概念 在Linux系统中,线程是指在同一个进程中并发执行的多个执行序列。...就提供了一个库:pthread库(原生线程库,Linux系统提供)——将轻量级进程的系统调用进行封装,转成线程相关的接口语义提供给用户 我们g++编译器是会默认链接 C++ 标准库。...里的原生库吗 结论:C++11的多线程,是对原生线程的封装 为什么要封装呢?...虽然一些其他语言(如Java、Python等)提供了自己的线程管理库或框架,但这些库或框架通常也是基于底层操作系统的原生线程API进行封装的。...// 模拟c++的线程库,也对Linux原生库进行封装 { template using func_t = std::function; /

    74910

    Linux下Socket编程(二)——多线程封装简介

    简介 客户端连接后放到线程中运行 Socket相关代码封装 C++线程 这里使用c++11标准的线程库。 #include 编译时候出现 ?...thread_1.png 根据错误提示编译命令后加入-std=c++0x即可,对于使用的线程需要引入库-lpthread 线程使用 线程的调用我们定义一个SocketThread类来进行 SocketThread...Socket相关类封装 这里我们将客户端和服务的的操作封装到一个类XTcp中,服务的接受连接后,生成一个新的Tcp对象,并将指针返回,然后线程类XThread持有XTcp的指针。...unistd.h> #include #include #include #include //c++ 11标准线程...cilentIp,port); XTcp* xTcpClient=new XTcp; xTcpClient->setSock(connfd); //开启线程接受数据

    1.2K30

    多线程调用的封装技巧

    很多时候, 我们想把一项操作放入后台线程去执行, 可能是为了提高操作体验(UI表现的流畅), 或者是性能(充分利用多核的计算能力)等 为了方便, 我在这里先定义一个简化的线程模型: 所有的操作都定义为命令...(Command) 后台线程监听一个命令队列, 如果有命令就执行, 没有就等待 如果收到结束通知, 则结束该线程 比如我们有两种操作: void PrintA() { printf("thread...Command, 发到后台线程去执行, 然后写一堆的swith-case去判断是什么命令, 再执行相应的操作 这种方式的好处就是简单, 而且也把操作细节隐藏在内部线程里了, 不过从编码的角度来看, 相当烦琐...在学习WPF时, 发现他们可以直接使用Dispatcher.BeginInvoke把某个函数发到后台去执行, 后来想了想, 其实就是把函数封装成对象发过去了....在阅读Unreal代码时发现, 里面用了几个很巧妙的宏, 可以把代码片段封装成对象, 这样就免去了定义函数的代码量.

    87970

    【Linux】多线程——线程概念|Linux下进程与线程|线程控制

    所以在Linux中,可以把进程和线程做一个统一,CPU看到的task_struct称为轻量级进程 在Linux中,什么是线程:CPU调度的基本单位!...所以Linux中,没有给Linux"线程"去专门设计对应的数据结构!而是直接复用PCB!用PCB来表示Linux内部的“线程”!...也就是说,Linux内核中有没有真正意义的线程,严格上来说是没有的,Linux是用进程PCB来模拟线程的,是一种完全属于自己的一套线程方案。...原生的线程库本质上就是对轻量级进程的系统调用(clone)进行了封装pthread_create,使用户层模拟实现了一套线程相关的接口 我们认为的线程实际在OS内部会被转化成我们所谓的轻量级进程。...,在Linux中,如果要实现多线程,必定要使用pthread库,如何看待C++11中的多线程:C++11的多线程,在Linux环境中本质就是对pthread库的封装。

    48030

    Linux多线程【线程池】

    ✨个人主页: 北 海 所属专栏: Linux学习之旅 操作环境: CentOS 7.6 腾讯云远程服务器 前言 线程池是一种管理线程的机制,它可以在需要时自动创建和销毁线程,以及分配和回收线程资源...,没加锁保护,导致出现问题 2.2.线程池_V2(封装版) 「封装版」:引入自己封装实现的线程库 Thread.hpp,支持对线程做出更多操作 之前写的线程池代码不够优雅,所能展现的线程相关信息太少了,...为此可以选择引入之前封装实现的 Thread.hpp 自己封装的 Thread.hpp 头文件 #pragma once #include #include 线程算是正式结束了,下一篇将会打开网络的大门 相关文章推荐 Linux多线程 =====:> 【初始多线程】、【线程控制】、【线程互斥与同步】、【生产者消费者模型】 Linux...】、【vim】、Linux 权限理解和学习、听说Linux基础指令很多?

    52840

    【Linux】线程的奥秘:Linux线程入门指南

    那么线程是什么,它和进程又有什么区别呢? 1. 什么是线程 线程(Thread)是操作系统中的一个重要的执行单元,是程序执行的最小调度单元。...线程存在于进程内部,一个进程可以包含一个或者多个线程,线程共享进程的资源并独立运行。 同时我们还要知道进程是承担系统资源分配的基本实体,而线程是CPU运行的基本单位。 2....开销 创建和切换开销较小 创建和切换开销较大 通信 同进程线程通信简单 需要使用 IPC(管道、共享内存等) 崩溃影响 一个线程崩溃会影响进程 一个进程崩溃对其他进程无直接影响 3.1 Linux与...Windows不同的线程设计 在Linux中,由于PCB和TCB的共同点太多了,于是直接复用了PCB的设计和调度策略,这样大大减少了系统的调度时的开销,因此Linux中实际没有真正的线程概念,有的只是复用了...在这种设计思想下,线程注定不会过于庞大,因此Linux中的线程又可以称为轻量级进程LWP,轻量级进程足够简单,且易于维护,效率更高、安全性强,可以使得Linux系统不间断的运行,不容易崩溃。

    7210

    【Linux】线程互斥

    线程互斥 一、互斥概念 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。...但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。多个线程并发的操作共享变量,会带来一些问题。 例如下面我们模拟一个多线程抢票的程序。...那么假设我们现在有两个线程,分别为线程1和线程2,在线程执行的代码间隙中,线程是随时有可能会被切换的!而线程在执行的时候,将共享数据加载到 CPU 寄存器的本质就是把数据的内容变成了自己上下文的内容!...互斥锁接口 在 Linux 中,pthread 库给我们提供了一种互斥锁解决上面多线程访问共享数据不一致的问题。...所以对于其它线程来说,一个线程要么没有锁,要么释放锁,当前线程访问临界区的过程,对于其它线程是原子的! 3.

    15610

    Linux——多线程

    在Linux中,什么是线程呢?是CPU调度的基本单位。 在Linux中,一个线程被称为轻量级进程。...这是因为Linux没有真正意义上的线程。...kw=thread 但是这里要注意:任何语言在Linux中要实现多线程,必定要使用pthread库。 C++11中的多线程,本质就是对pthread库的封装。...Linux的方案;用户级线程,这些属性在库中,内核提供线程执行流的调度。 Linux用户级线程:Linux内核轻量级进程 == 1:1 那么线程的id究竟是什么呢?...也就是说给每个线程都来一份这个变量,两个线程在使用这个变量的时候互不影响。 如果以后给线程设置私有属性可以加上这个。 封装线程接口 这里就用Linux的线程接口来实现C++中的多线程部分功能。

    94330

    Linux多线程

    线程是进程内部的一个执行流,在Linux下并没有为线程额外创建数据结构来管理,而是通过只建立PCB来模拟实现的;但是在Windows下为了管理线程又创建了TCB内核数据结构来管理; Linux这种方式一方面是提高了代码的复用率...,而是线程;线程的资源是占用进程的,所以进程其实是分配操作系统资源的基本单位 Linux下进程和线程的关系: 之前我们接触的都是单进程多线程或者多个单线程进程 3.线程的数据属性 一个进程内部的线程共享大部分的资源比如...Linux没有真正的线程,所以它没有提供创建线程的系统调用接口,只提供了轻量级进程的接口,所以要创建线程还需要借助原生线程库(pthread),但其实创建的还是轻量级进程,首先来认识一下创建接口 PTHREAD_CREATE...那么该全局变量则会映射到新线程的线程栈中,此后如果某一个线程修改了该全局变量不会影响到其他线程 ---- 线程控制 1.创建多线程 在Linux下连续创建10个线程,将自定义类对象传到新创建的线程中...-- 对原生线程库再封装 a.Thread.hpp #include #include #include #include

    23430

    【Linux】线程互斥

    ,第2步在寄存器中对数据做--操作 线程A正准备做第3步时,时间片到了,线程A不能继续向后运行了 线程A要把自己的上下文保护起来,并且将寄存器中的数据也带走了 ---- 线程a认为值已经被改成99了...,所以无法执行第3步,把线程B的上下文保存起来 ---- 此时再次执行线程A,由于上次执行线程A时第3步没有执行,所以线程A继续执行第3步 但是内存中的g_val为上次线程B修改后的值10,又被改为99...任何一个线程 都有自己的代码访问临界资源,这部分代码 被称为 临界区 同样存在不访问临界资源的区域 被称为 非临界区 用于 衡量 线程代码的 让多个线程安全的访问临界资源 —— 加锁 即完成互斥访问...再将寄存器中的数据 与 内存中的数据 进行 交换 ---- 线程b 继续执行时 要进行判断 ,寄存器数据不大于0,当前线程被挂起 线程b申请锁失败 线程b 带走了自己的上下文 即 寄存器中的数据为0...---- 再次切换成 线程a,带回来线程a的寄存器数据 1,并继续执行 上次还未执行到的判断 ---- 线程a的寄存器中的数据大于0,返回0,申请锁成功

    17230

    Linux多线程【线程控制】

    ,需要先补充一波线程相关知识 1.2、线程私有资源 在 Linux多线程【初识线程】 中我们得出了一个结论:Linux 中没有真线程,只有复用 PCB 设计思想的 TCB 结构 因此 Linux 中的线程本质上就是...所以为了使用户能愉快的对线程进行操作,就需要对系统提供的轻量级进程操作相关接口进行封装:对下封装轻量级进程操作相关接口,对上给用户提供线程控制的相关接口 这里很好的体现了计算机界的哲学:通过添加一层软件层解决问题...在 Linux 中,封装轻量级进程操作相关接口的库称为 pthread 库,即 原生线程库,这个库文件是所有 Linux 系统都必须预载的,用户使用多线程控制相关接口时,只需要指明使用 -lpthread...进程地址空间 映射至 共享区 中供线程使用 由于用户并不会直接使用 轻量级进程 的接口,于是 需要借助第三方库进行封装,类似于用户可能不了解系统提供的 文件接口,从而使用 C语言 封装的 FILE...++11 提供的 thread 线程库,在 Linux 平台中运行时,也需要带上 -lpthread 选项,因为它本质上是对 原生线程库 的封装 3.2、理解线程独立栈 线程 之间存在 独立栈,可以保证彼此之前执行任务时不会相互干扰

    21630
    领券