• 赵岩松
    2022-01-12
    对于PCB我一直有一个疑惑,在我的理解中这个概念是操作系统统一的一个抽象概念,同时据我所知Linux中存在两个进程相关的结构:`thread_info`和`task_struct`,那么PCB和这两个结构有没有对应关系呢?至于TCB是我今天第一次听到的一个概念,同样的这个概念与前面提到的两个Linux结构有对应关系吗?

    作者回复: 是的,其实 PCB 与 TCB 就是针对进程和线程的两个不同的抽象概念,具体实现是可以多种多样的。简单来讲,Linux 在实现中没有为进程和线程单独设置用于存放相关信息的数据结构,而是统一使用 task_struct 存储通用的任务信息,使用 thread_info 存放平台相关的信息。区分是不是线程就看不同 task_struct 对象之间有没有共享资源。即你可以认为在 Linux 中只有进程(PCB),没有独立的线程(TCB)。而相较于 Windows 和 Sun Solaris 等明确区分进程与线程的操作系统实现,Linux 的实现相对更加优雅。 — 参考自《Linux Kernel Development 3rd Edition》,基于 2.6 版本内核。

    
    8
  • =
    2022-01-12
    1. IO密集型的应用。因为CPU等待IO完成的时间很多,在等待的时间内,多线程可以让其他应用继续执行 2. 有多核CPU时的计算密集型应用。因为可以利用多核CPU并行的优势,来快速完成计算

    作者回复: 回答的很棒!

    
    7
  • Luke
    2022-09-06 来自江苏
    Windows的VC对于c11的threads支持不好,微软是希望大家在它平台上用c艹😂,如果头铁非要在Windows上写标准化的C语言程序,threads这块老师有什么替代方案吗?pthread? 一开始在Linux下gcc编译,提示找不到thrd_xx的符号,原来编译选项要从-lthreads改成-pthreads

    作者回复: Windows 我用的少,盲猜 pthread 可能好用一些 hhh

    
    2
  •  焚心以火
    2022-02-09
    大家有遇到 fatal error: 'threads.h' file not found 是怎么解决的呢?

    作者回复: 大多数情况是由于编译器不支持 C11 的多线程特性,你可以通过检测宏常量 __STDC_NO_THREADS__ 来判断当前编译器是否支持 threads.h,然后仅在支持的情况下再 include。

    
    2
  • 杰良
    2022-10-26 来自广东
    老师好,指令重排的例子,试了十多次没出现打印 x 为 0 的情况。这里可能发生的先执行 y 变量的更新的原因会是什么呢?

    作者回复: 主要是由于 CPU 流水线在执行指令时的顺序不确定性。乱序执行的目的本身还是在于提高指令执行性能。比如通过合理安排执行顺序,减少指令执行之间的数据等待,等等。

    
    1
  • 小杰
    2022-05-07
    如果编译显示没有threads文件,有两种方法可以解决。1、使用pthread.h头文件,使用方式与threads一样,也有不同的地方,但是极少。2、使用ubuntu20.04,gcc+glibc都是支持threads.h的,编译时可能也会出现没有此文件的错误,因为缺少一些文件。具体希望大家动手去解决。 最后回答一下老师的问题,适合场景应该是高并发,比如大量消息队列的处理,可以使用多线程。可以不用去等待一个任务执行完毕,再去执行下一个任务,这样可以充分利用cpu

    作者回复: 赞👍🏻

    
    1
  • ppm
    2022-01-12
    请问一个进程里面长时间有多个线程 好不好

    作者回复: 可以再描述的具体点?

    共 4 条评论
    1
  • 烟徒
    2023-03-13 来自北京
    现在 C11 的 threads.h 库支持不是特别完善,用 c11 来讲,省劲是省劲,。。。

    作者回复: 嗯是的,确实是这样,大部分情况还是 posix。

    
    
  • 漠博嵩
    2022-05-28
    cmake 说找不到。函数

    作者回复: 哪一个函数没找到?

    
    
  • ABC
    2023-08-25 来自北京
    便可能出现这样一种情况:某个线程以原子形式,执行了代码的第 14 行语句,将金额累加到账户 A。而此时,调度器将执行流程转移给另一个线程。该线程在上一个线程还没有完成对账户 B 的扣减操作前,便直接使用未同步的值参与了下一次的转账操作。 这句话表述有问题,应该是: 便可能出现这样一种情况:某个线程以原子形式,执行了代码的第 14 行语句,将金额累加到账户 B。而此时,调度器将执行流程转移给另一个线程。该线程在上一个线程还没有完成对账户 A 的扣减操作前,便直接使用未同步的值参与了下一次的转账操作。
    
    