首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python线程管理

Python线程管理

作者头像
星哥玩云
发布于 2022-09-08 05:49:57
发布于 2022-09-08 05:49:57
41800
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

一、线程

1、概念

  • 线程 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程
  • 多线程 是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。
  • 模块 _thread模块:低级模块 threading模块:高级模块,对_thread进行了封装

2、启动线程实现多任务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> threading

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run1</span><span class="hljs-params">()</span>:</span>
                                      <span class="hljs-comment"># 线程名字</span>
    print(<span class="hljs-string">"启动%s子线程……"</span>%(threading.current_thread().name))
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">5</span>):
        print(<span class="hljs-string">"zutuanxue_com is a good man"</span>)
        time.sleep(<span class="hljs-number">1</span>)

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run2</span><span class="hljs-params">(name, word)</span>:</span>
    print(<span class="hljs-string">"启动%s子线程……"</span> % (threading.current_thread().name))
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">5</span>):
        print(<span class="hljs-string">"%s is a %s man"</span>%(name, word))
        time.sleep(<span class="hljs-number">1</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    t1 = time.clock()
    <span class="hljs-comment"># 主进程中默认有一个线程,称为主线程(父线程)</span>
    <span class="hljs-comment"># 主线程一般作为调度而存在,不具体实现业务逻辑</span>

    <span class="hljs-comment"># 创建子线程</span>
    <span class="hljs-comment"># name参数可以设置线程的名称,如果不设置按顺序设置为Thread-n</span>
    th1 = threading.Thread(target=run1, name=<span class="hljs-string">"th1"</span>)
    th2 = threading.Thread(target=run2, args=(<span class="hljs-string">"kaige"</span>, <span class="hljs-string">"nice"</span>))

    <span class="hljs-comment">#启动</span>
    th1.start()
    th2.start()

    <span class="hljs-comment">#等待子线程结束</span>
    th1.join()
    th2.join()

    t2 = time.clock()
    print(<span class="hljs-string">"耗时:%.2f"</span>%(t2-t1))

3、线程间共享数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> threading

money = <span class="hljs-number">0</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run1</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">global</span> money
    money = <span class="hljs-number">1</span>
    print(<span class="hljs-string">"run1-----------"</span>, money)
    print(<span class="hljs-string">"启动%s子线程……"</span>%(threading.current_thread().name))
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">5</span>):
        print(<span class="hljs-string">"zutuanxue_com is a good man"</span>)
        time.sleep(<span class="hljs-number">1</span>)

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run2</span><span class="hljs-params">(name, word)</span>:</span>
    print(<span class="hljs-string">"run2-----------"</span>, money)
    print(<span class="hljs-string">"启动%s子线程……"</span> % (threading.current_thread().name))
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">5</span>):
        print(<span class="hljs-string">"%s is a %s man"</span>%(name, word))
        time.sleep(<span class="hljs-number">1</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    t1 = time.clock()

    th1 = threading.Thread(target=run1, name=<span class="hljs-string">"th1"</span>)
    th2 = threading.Thread(target=run2, args=(<span class="hljs-string">"kaige"</span>, <span class="hljs-string">"nice"</span>))

    th1.start()
    th2.start()
    th1.join()
    th2.join()

    t2 = time.clock()
    print(<span class="hljs-string">"耗时:%.2f"</span>%(t2-t1))
    print(<span class="hljs-string">"main-----------"</span>, money)

说明:多线程和多进程的最大的不同在于多进程中同一个全局变量每个子进程各自有一份拷贝,相互不影响。而在多线程中,所有变量都由线程共享

注意:多个线程同时修改一个变量容易内存错乱,下节课我们将进行演示

4、多线程内存错乱问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> threading

money = <span class="hljs-number">0</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">change_money</span><span class="hljs-params">(n)</span>:</span>
    <span class="hljs-keyword">global</span> money
    money += n
    money -= n

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run1</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1000000</span>):
        change_money(<span class="hljs-number">5</span>)

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run2</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1000000</span>):
        change_money(<span class="hljs-number">9</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    t1 = time.clock()

    th1 = threading.Thread(target=run1)
    th2 = threading.Thread(target=run2)

    th1.start()
    th2.start()
    th1.join()
    th2.join()

    t2 = time.clock()
    print(<span class="hljs-string">"耗时:%.2f"</span>%(t2-t1))
    print(<span class="hljs-string">"main-----------"</span>, money)

问题:两个线程对同一数据同时进行读写,可能造成数据值的不对,我们必须保证一个线程在修改money时其他的线程一定不能修改,线程锁解决数据混乱问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> threading

<span class="hljs-comment">#锁对象</span>
lock = threading.Lock()

money = <span class="hljs-number">0</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">change_money</span><span class="hljs-params">(n)</span>:</span>
    <span class="hljs-keyword">global</span> money
    money += n
    money -= n

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run1</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1000000</span>):
        <span class="hljs-comment">#获取线程锁,如果已上锁,则阻塞</span>
        lock.acquire()
        <span class="hljs-keyword">try</span>:
            change_money(<span class="hljs-number">5</span>)
        <span class="hljs-keyword">finally</span>:
            <span class="hljs-comment">#释放锁:千万要注意释放锁(自己的锁自己放),否则会造成死锁</span>
            lock.release()

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run2</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1000000</span>):
        <span class="hljs-comment">#简写,功能与上面一致</span>
        <span class="hljs-keyword">with</span> lock:
            change_money(<span class="hljs-number">9</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    t1 = time.clock()

    th1 = threading.Thread(target=run1)
    th2 = threading.Thread(target=run2)

    th1.start()
    th2.start()
    th1.join()
    th2.join()

    t2 = time.clock()
    print(<span class="hljs-string">"耗时:%.2f"</span>%(t2-t1))
    print(<span class="hljs-string">"main-----------"</span>, money)

5、Thread Local

得到一个ThreadLocal对象,可以为每个线程提供独立的存储空间,每个线程都可以对它进行读写操作,但是相互不影响

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> threading

local = threading.local()

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run1</span><span class="hljs-params">()</span>:</span>
    local.money = <span class="hljs-number">1</span>
    print(<span class="hljs-string">"run1-----------"</span>, local.money)
    time.sleep(<span class="hljs-number">1</span>)

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run2</span><span class="hljs-params">()</span>:</span>
    time.sleep(<span class="hljs-number">2</span>)
    local.money = <span class="hljs-number">2</span>
    print(<span class="hljs-string">"run2-------------"</span>, local.money)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    t1 = time.clock()

    th1 = threading.Thread(target=run1)
    th2 = threading.Thread(target=run2)
    th1.start()
    th2.start()
    th1.join()
    th2.join()

    t2 = time.clock()
    print(<span class="hljs-string">"耗时:%.2f"</span>%(t2-t1))

6、封装线程

zutuanxue_com_thread.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> threading

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Zutuanxue_comThread</span><span class="hljs-params">(threading.Thread)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, num)</span>:</span>
        super().__init__()
        self.num = num
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run</span><span class="hljs-params">(self)</span>:</span>
        print(<span class="hljs-string">"-----------"</span>, self.num)

main.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">from</span> zutuanxue_com_thread <span class="hljs-keyword">import</span> Zutuanxue_comThread

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    th = Zutuanxue_comThread(<span class="hljs-number">1</span>)
    th.start()
    th.join()

7、线程通信

通信原理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> threading

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run</span><span class="hljs-params">(event)</span>:</span>
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">10</span>):
        event.wait()
        print(<span class="hljs-string">"----------"</span>, i)
        event.clear()

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    event = threading.Event()

    th = threading.Thread(target=run, args=(event,))
    th.start()

    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">10</span>):
        value = input()
        <span class="hljs-keyword">if</span> value == <span class="hljs-string">"y"</span>:
            <span class="hljs-comment"># 让线程运行一下</span>
            event.set()

    th.join()

生产者与消费者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">import</span> threading
<span class="hljs-keyword">import</span> time

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">product</span><span class="hljs-params">(q,e)</span>:</span>
    print(<span class="hljs-string">"启动生产子线程……"</span>)
    <span class="hljs-keyword">for</span> data <span class="hljs-keyword">in</span> [<span class="hljs-string">"good"</span>, <span class="hljs-string">"nice"</span>, <span class="hljs-string">"cool"</span>, <span class="hljs-string">"handsome"</span>]:
        time.sleep(<span class="hljs-number">2</span>)
        print(<span class="hljs-string">"生产出:%s"</span>%data)
        <span class="hljs-comment"># 将生产的数据写入队列</span>
        q.append(data)
        e.set()
    print(<span class="hljs-string">"发送结束信号"</span>)
    time.sleep(<span class="hljs-number">2</span>)
    e.set()
    print(<span class="hljs-string">"结束生产子线程……"</span>)

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">customer</span><span class="hljs-params">(q,e)</span>:</span>
    print(<span class="hljs-string">"启动消费子线程……"</span>)
    <span class="hljs-keyword">while</span> <span class="hljs-number">1</span>:
        print(<span class="hljs-string">"等待生产者生产数据"</span>)
        e.wait()
        <span class="hljs-keyword">if</span> len(q) == <span class="hljs-number">0</span>:
            <span class="hljs-keyword">break</span>
        <span class="hljs-keyword">else</span>:
            value = q.pop()
        print(<span class="hljs-string">"消费者消费了%s数据"</span>%(value))
        e.clear()

    print(<span class="hljs-string">"结束消费子线程……"</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    q = []
    e = threading.Event()

    p1 = threading.Thread(target=product, args=(q,e))
    p2 = threading.Thread(target=customer, args=(q,e))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    print(<span class="hljs-string">"END"</span>)

二、进程VS线程

  • 多任务的实现原理 通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker
  • 多进程 主进程就是Master,其他进程就是Worker
    • 优点 稳定性高:一个子进程崩溃了,不会影响主进程和其他子进程,当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低
    • 缺点 创建进程的代价大:在Unix/Linux系统下,用fork调用还行,在Windows下创建进程开销巨大 操作系统能同时运行的进程数也是有限的:在内存和CPU的限制下,如果有几千个进程同时运行,操作系统连调度都会成问题
  • 多线程 主线程就是Master,其他线程就是Worker
    • 优点 多线程模式通常比多进程快一点,但是也快不到哪去 在Windows下,多线程的效率比多进程要高
    • 缺点 任何一个线程挂掉都可能直接造成整个进程崩溃:所有线程共享进程的内存。在Windows上,如果一个线程执行的代码出了问题,你经常可以看到这样的提示:“该程序执行了非法操作,即将关闭”,其实往往是某个线程出了问题,但是操作系统会强制结束整个进程
  • 计算密集型 vs IO密集型
    • 计算密集型 要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数
    • IO密集型 涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝慢慢看(2)
什么叫互斥量,顾名思义就是咱这么多人,只能有一个使用这个资源,就像共享小单车,一次只能给一个人用,一个人下车锁车了,另一个人才能去扫码开锁。
看、未来
2020/08/25
4890
Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝慢慢看(2)
Android NDK POSIX 多线程编程
POSIX 全称是 Portable Operating System Interface of UNIX ,表示可移植操作系统接口,本质上是一种编程标准。它定义了操作系统应该为应用程序提供的接口标准,是 IEEE 为要在各种 UNIX 操作系统上运行的软件而定义的一系列 API 标准的总称。
字节流动
2021/06/09
1.2K0
java多线程总结
进程:是一个正在执行的程序 每个进程都有一个执行顺序,该顺序是一个执行路径或叫一个控制单元,
全栈程序员站长
2022/07/15
3340
iOS 多线程-Thread
其中前三种方式我们比较常用,其中 GCD、Operation 使用的最频繁。Pthreads 是基于 C 语言的框架,可以跨平台使用,我们平时使用比较少。
CoderStar
2022/09/23
1.1K0
iOS 多线程-Thread
C语言服务器编程必备常识
入门 包含了正确的头文件只能编译通过,没链接正确的库链接会报错。 一些常用的库gcc会自动链接。 库的缺省路径/lib /usr/lib /usr/local/lib 不知道某个函数在那个库可以nm -o /lib *.so | grep 函数名 man sin 会列出包含的头文件和链接的库名。 man 2 sin 2表示系统调用,3表示c库函数 一旦子进程被创建,父子进程一起从fork处被创建。 创建子进程为了争夺资源。 重定向用dup2函数 kill -l查看信号种类 pthread_mutex不跨进
震八方紫面昆仑侠
2021/01/03
1.4K0
图解|打工人看腾讯这道多线程面试题
虽然两个人都在北京,但是距离不算近,一个在望京,一个在中关村,算是北京几大IT聚集圈之二了。
C语言与CPP编程
2020/12/02
4850
图解|打工人看腾讯这道多线程面试题
多线程中的生产者消费者问题 - 线程的同步
操作系统中的生产者消费者问题,就是一个经典的同步问题。举一个例子,有两个人,一个人在刷盘子,另一个人在烘干。这两个人各自代表一个线程,他们之间有一个共享的对象 --- 盘架,刷好而等待烘干的盘子放在盘架上。两个人在没有事做事都愿意歇着。显然,盘架上有刷好的盘子时,烘干的人才能开始工作;而如果刷盘子的人刷的太快,刷好的盘子占满了盘架时,他就不能再继续工作了,而要等到盘架上有空位置才行。
用户1289394
2020/12/08
5760
多线程中的生产者消费者问题 - 线程的同步
《多线程系列一》线程是什么?怎么理解多线程!
线程是操作系统调度的最小单元,也叫轻量级进程。它被包含在进程之中,是进程中的实际运作单位。同一进程可以创建多个线程,每个进程都有自己独立的一块内存空间。并且能够访问共享的内存变量。
香菜聊游戏
2021/03/09
4890
java 并发多线程 锁的分类概念介绍 多线程下篇(二)
抗战电影中,经常出现为了阻止日本人炸桥?炸路?的场景,这只是阻止日本人的一种手段,如果大喊一声TMD滚蛋,日本人就走了,还炸桥干嘛?
noteless
2019/03/15
7080
java 并发多线程 锁的分类概念介绍 多线程下篇(二)
温故Linux后端编程(三):线程
在多处理器共享内存的架构中(如:对称多处理系统SMP),线程可以用于实现程序的并行性。历史上硬件销售商实现了各种私有版本的多线程库,使得软件开发者不得不关心它的移植性。对于UNIX系统,IEEE POSIX 1003.1标准定义了一个C语言多线程编程接口。依附于该标准的实现被称为POSIX theads 或 Pthreads。
看、未来
2021/09/18
7020
Java 多线程
程序(program)是为完成特定任务、用某种语言编写的一组指令的集合 即指一 段静态的代码,静态对象。
Java_慈祥
2024/08/06
1630
Java 多线程
40个多线程问题总结
作者:五月的仓颉 来自:cnblogs.com/xrq730/p/5060921.html 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这
架构师小秘圈
2018/04/18
6900
40个多线程问题总结
Linux Qt使用POSIX多线程条件变量、互斥锁(量)
之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子。故此来和大家一起分享,希望和大家一起交流。
用户5908113
2019/07/31
2.4K0
多线程详解
假如计算机只有一个CPU,那么CPU在某一时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性的。
秋落雨微凉
2022/10/25
4720
Java 多线程(超详细)
多线程学习思路:为什么学习线程?为了解决CPU利用率问题,提高CPU利用率。 =》 什么是进程?什么是线程? =》 怎么创建线程?有哪几种方式?有什么特点? =》 分别怎么启动线程? =》 多线程带来了数据安全问题,该怎么解决? =》 怎么使用synchronized(同步)决解? =》使用同步可能会产生死锁,该怎么决解? =》 线程之间是如何通信的? =》 线程有返回值吗?该如何拿到? =》 怎么才能一次性启动几百上千个的线程?
全栈程序员站长
2022/09/08
3200
Java 多线程(超详细)
进程同步概念简介 多线程上篇(四)
比如尽管有两个人去水井打水,但是水井却只有一个;合理安排的话刚好错开,但是如果安排不合理,那就会出现冲突,出现冲突怎么办?总有一个先来后到,等下就好了。
noteless
2019/03/04
1.5K0
Linux:多线程(三.POSIX信号量、生产消费模型、线程池、其他常见的锁)
信号量是一种用于进程间通信和同步的机制。它本质上是一个计数器,用于衡量系统中的资源可用数量。通过信号量,可以实现对临界资源的访问控制,确保多个进程或线程能够安全地共享资源而不发生冲突。
是Nero哦
2024/08/16
5081
Linux:多线程(三.POSIX信号量、生产消费模型、线程池、其他常见的锁)
Java 多线程 从无到有
个人总结:望对屏幕对面的您有所帮助 一. 线程概述 进程: 有独立的内存控件和系统资源 应用程序的执行实例 启动当前电脑任务管理器:taskmgr 进程是程序(任务)的执行过程,它持有资源(共享内存,
房上的猫
2018/04/17
8650
Java 多线程 从无到有
【Linux】线程与线程安全知识总结
我最近复习了线程安全这部分知识,将不明白的问题总结出来,并通过AI进行问答帮助我进行学习巩固。本人能力有限 ,可能有些内容不准确,望各位大佬海涵!!!
叫我龙翔
2024/10/08
2310
【Linux】线程与线程安全知识总结
Linux多线程Pthread学习小结
POSIX thread 简称为pthread,Posix线程是一个POSIX标准线程.该标准定义内部API创建和操纵线程.
阳光岛主
2019/02/20
2.2K0
推荐阅读
相关推荐
Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝慢慢看(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档