V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
chaleaoch
V2EX  ›  Linux

看视频教程的时候,老师说了这样一句话...我不是很理解.

  •  
  •   chaleaoch · 245 天前 · 3218 次点击
    这是一个创建于 245 天前的主题,其中的信息可能已经有所发展或是发生改变。
    讲到 linux 多线程这块.

    老师原话是这样的:"多线程还有一个好处, 我们后来做了一个这样的约定,一个新的库发布出来,默认就要支持多线程并发,如果一个函数不支持多线程并发,要在函数说明或者函数的名字中体现出来"

    我的问题是 什么叫默认支持多线程并发? 是指 线程安全吗?

    因为是录播...没法问.
    16 条回复    2021-04-09 18:35:04 +08:00
    muntoya
        1
    muntoya   245 天前 via iPhone   ❤️ 1
    就是说函数能被并发调用不出问题,实现中没使用共享变量,或者使用时加了锁。
    Shura
        2
    Shura   245 天前   ❤️ 2
    就是函数是线程安全的
    levenwindy
        3
    levenwindy   245 天前 via Android
    新建 1 万个用户 while 循环,{}& 后台运行,你总不能开启一万个后台同时运行吧,得通过管道限制,简称并发
    CEBBCAT
        4
    CEBBCAT   244 天前 via Android
    可重入性?
    neoblackcap
        5
    neoblackcap   244 天前
    居然是默认线程安全?我看 linux 社区都是默认不线程安全,线程安全都是会在文档里面写出来的呢
    Cbdy
        6
    Cbdy   244 天前 via Android
    应该默认线程不安全,默认线程安全坑死你
    tedzhou1221
        7
    tedzhou1221   244 天前
    我的感觉和 #5 差不多,一个功能或函数,线程安全不是最基本的吗?出现线程安全问题就是有 BUG

    我有时候看那么教学视频,很多讲师,不能说是老师,他们大部分都是按流程说把内容说出来,有一些真的一知半解的。
    tedzhou1221
        8
    tedzhou1221   244 天前
    我在 Java 里接触到,有的代码,为了说明功能是否是线程安全,都会在注释里说明,或者用 @ThreadSafe 之类的注解标明。但一般都是默认线程安全。
    nightwitch
        9
    nightwitch   244 天前
    一般都是默认线程不安全。
    线程安全的话一般实现都会带锁,这样单线程的用户就会付出额外的性能损失。
    buffzty
        10
    buffzty   244 天前   ❤️ 1
    函数名后面加_s 就是线程安全的,默认是不安全(快)的。
    支持多线程并发是指多线程并发调用安全 你理解的没错,但是很多库并不是默认支持。
    no1xsyzy
        11
    no1xsyzy   244 天前
    默认线程安全是不可能的。除非你用函数式语言或者,否则这一约定的实现是复杂而低效的。
    尤其是 builder 一类的对象。因为在 build 的过程中常常是唯一写引用。
    ponylang 里面可以用 variable capability 来保证写引用的排他性,函数可以要求只能在某些 cap (包括其 subcap )上调用,线程安全靠编译器保证。

    (在玩 pony,真的线程安全到吓人,而且没有锁,但是 cap 太麻烦了,成天 recover cap,跟锁心智负担其实差不多,debug 的一半时间在解决编译器报的 cap 问题。好处是没有竞态条件。
    Flymachine
        12
    Flymachine   244 天前   ❤️ 2
    c++ STL 库 里一堆线程不安全的,包括最常用的 std::string 和 std::vector (或者说,多线程写入不安全)。
    要求 C++库默认线程安全是不现实的。
    C 就更不用说了。

    但其他语言就不一定了。
    比如 Rust, 没 unsafe 关键字的代码肯定是线程安全的,或许可以实现“默认线程安全”。
    比如 PHP,CGI 运行主要是多进程,无所谓线程安全。
    比如 Java 、Go 之类的,天生就是做高并发的网络应用。肯定愿意为了线程安全牺牲那点性能——否则为啥不上 C++。所以“默认线程安全”。
    Jirajine
        13
    Jirajine   243 天前 via Android
    @Flymachine 是否有 unsafe 和是否线程安全有什么关系,没有 unsafe 代表你的程序不会 ub,用了 unsafe 代表需要自己 hold contract 。而标识一个类型是否线程安全的是 Send 和 Sync 这两个 trait 。
    Java 、go 也一样,多数基本内置类型都是线程不安全的,线程安全需要加锁使用专门的 Atomic 类型。
    Flymachine
        14
    Flymachine   243 天前
    @Jirajine Rust 这块应该是我理解有误了,感谢你的指导。
    不过 Jave 和 Go 上,我的意思是他们会更重视线程安全而非性能。所以写开源库时可能会尽量保证“默认线程安全”。不是说做出来就是线程安全的...
    qbqbqbqb
        15
    qbqbqbqb   198 天前
    @Jirajine 我记得 Rust 的类型系统好像是对线程安全有一定保障的,会为自己写的 struct 自动推导 Send 和 Sync 的 trait,不用 unsafe 的话可以基本保证语义层面的安全(也就是说不会破坏内存中的对象;但是业务层面仍然有可能是不安全的)
    Jirajine
        16
    Jirajine   198 天前
    @qbqbqbqb #15 Safe Rust 能够保障你的代码没有 data race,但不能(也不可能)保障没有 race condition 。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2085 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 15:43 · PVG 23:43 · LAX 08:43 · JFK 11:43
    ♥ Do have faith in what you're doing.