写了博客被面试官看到了,还说博客不错,抓着一个底层的点狂问,感觉要窒息了。
博客里写了 Python 的线程不安全是因为 i++;等 C 语言的库原生就不是线程安全的,导致 Python 也不是线程安全的。然后被疯狂问 i++你怎么理解非线程安全?怎么想的?从底层理解解释一下?感觉要死了
PS:面试官人很好,就是我太菜了,哭了哭了(´•̥  ̯ •̥`)
|  |      1zhuangzhuang1988      2021-01-12 20:41:15 +08:00 via Android  4 🤔过了中二期,不写 blog,大部分人写 blog 是浪费时间,又感觉自己努力的一件事情,实际上有没有提升,自己最知道了 | 
|  |      2snxq1995      2021-01-12 20:42:50 +08:00 via Android 写原创性观点,不然真没意思。 | 
|  |      3Kasumi20      2021-01-12 20:44:00 +08:00 i++不安全,你不会加锁吗 | 
|  |      4liuxu      2021-01-12 20:47:58 +08:00 说实话,蛮难理解为什么 i++不是线程安全的,也就是非原子操作。 | 
|  |      5liuxu      2021-01-12 20:49:34 +08:00 @liuxu #4 高级语言使用了临时内存,i 增加后再赋值到 i 的内存中,所以非原子了。但是汇编有 inc 指令,编译器没优化吗,还是有什么特殊性。。 | 
|      6caiji11      2021-01-12 20:50:07 +08:00  1 @zhuangzhuang1988 我感觉写 blog 是把自己理解了的东西 比如说跳表的结构 没感觉浪费时间 就是忙的时候就坚持下来 | 
|  |      7liuxu      2021-01-12 20:54:29 +08:00 @liuxu #5  相关文章表示 i++会编译成 mov ecx,dword ptr [i] add ecx,1 mov dword ptr [i],ecx ;i 自增 所以就很奇怪,明明可以 inc <mem>的 inc, dec — Increment, Decrement The inc instruction increments the contents of its operand by one. The dec instruction decrements the contents of its operand by one. Syntax inc <reg> inc <mem> dec <reg> dec <mem> Examples dec eax — subtract one from the contents of EAX. inc DWORD PTR [var] — add one to the 32-bit integer stored at location var | 
|  |      8liuxu      2021-01-12 21:05:56 +08:00 @liuxu #7 不好意思,我又查了一下,inc 指令也是非原子操作,需要 LOCK 前缀才能原子操作,而且 inc 不会修改 cf 寄存器,add 会修改 https://www.felixcloutier.com/x86/inc | 
|  |      9LGA1150      2021-01-12 21:07:33 +08:00 光 inc 指令也不足以保证线程安全,如果有多个核心同时运行了一个 inc 指令呢? 你可以参考下 Linux 内核的 atomic_inc https://elixir.bootlin.com/linux/v5.11-rc3/source/tools/arch/x86/include/asm/atomic.h#L49 | 
|      10p2pCoder      2021-01-12 21:10:03 +08:00 这问题其实挺常规,挺八股的,涉及语言的内存模型以及操作系统基础 主内存和 cpu 多级缓存 以及寄存器,计算肯定是 cpu 计算,然后赋值运算同步到主内存 上面说到的 inc 命令,这东西涉及性能问题,我不是科班出生,对汇编了解不多,但是这东西本质和缓存系统设计差不多,如果把直接编译 inc 这种可以保证原子的操作,肯定就牺牲了多级缓存的性能,各语言也提供了对应的++对应的原子操作,毕竟大多数代码 i++操作,不是在多线程环境下运行的,直接这么编译,大多数 i++操作性能都会变差 | 
|  |      11icyalala      2021-01-12 21:15:46 +08:00 | 
|  |      12also24      2021-01-12 21:24:09 +08:00  1 从结果角度来看,我觉得这里其实取决于面试官的两种心态取向。 A:这个人答不出的问题蛮多的,不太行。 B:这个人懂的东西蛮多的,还不错。 对于前者的话,在意的是给你 10 个问题你能回答出几个,那自然是浅显的问题更好。 对于后者的话,在意的是你最多能回答出多大范围的问题,那当他提出更深的问题的时候,其实潜意识中已经认为你能够回答出更浅显的问题了。 | 
|  |      13musi      2021-01-12 21:47:09 +08:00 不懂那些说些博客是浪费时间的人是怎么写博客的。。。 | 
|  |      14aaronlam      2021-01-12 22:03:46 +08:00 我觉得认真去写博客,的确是能一个让自己从头到尾弄懂一个问题的方式,也是能靠这种方式去梳理自己知识体系。虽然,后面会因为记忆曲线的问题而忘掉大部分细节。但是,如果回头再去看一下还是能迅速把细节轮廓建立起来。 | 
|  |      15szxczyc OP  1 @zhuangzhuang1988 别的不说,写一下博客整理一下东西顺带写个思维导图,记得更牢固。这是真的 | 
|      16nightwitch      2021-01-12 22:38:50 +08:00  1 | 
|  |      17akakidz      2021-01-12 22:52:38 +08:00 via Android  3 想开一点...说不定面试官也是看了你的博客之后恶补了一下呢... | 
|  |      19webshe11      2021-01-13 00:05:18 +08:00 via Android 跟博客没关系,就算没博客,扯到一些细节的点照样被抓住狂问 只要不是培训班三个月出来的,对面试的东西自己死磕过一些,多少就不怕面试官死磕了 | 
|      20gidot      2021-01-13 00:28:18 +08:00  1 面试官私下百度恶补,面试是内心暗笑,这个逼今天装的满分。 | 
|      21zsf520zsf      2021-01-13 07:55:40 +08:00 via iPhone 我就是怕面试官看到我博客要问太深的东西,就没在简历贴博客地址,然而我博文里面很多不是完全原创的,时间久了自己也忘了... | 
|  |      22rodrick      2021-01-13 08:14:28 +08:00 面之前把博客里文章过一遍,觉得自己忘记的没搞懂的先隐藏了,面完再加回去[狗头] | 
|      23Sunnic      2021-01-13 08:20:53 +08:00 via Android 说的越多越坏事 | 
|  |      24yzbythesea      2021-01-13 08:36:09 +08:00 i++ 非线程安全不是显而易见。。。所以你都没理解线程安全和原子操作,为什么还写在博客或者放在简历里。。。 | 
|  |      25treblex      2021-01-13 08:51:19 +08:00 | 
|  |      26wangyzj      2021-01-13 09:12:28 +08:00 面试官也未必懂 | 
|  |      27towry      2021-01-13 09:33:43 +08:00  2 面试管懂不懂不重要,就算人家不是很精通,但是这是场面试,你只要能把面试官 说服忽悠住就是你真的厉害。 比如面试官问你 js 中 getOwnProperty 这个方法是做啥的,你支支吾吾的说是做这个的,其实你不懂。 假如你说不记得 js 中有 getOwnProperty 这个方法,但是有 hasOwnProperty 这个方法,这个方法是...。 这说明你是真的懂 /精通。 一些人面试喜欢纠结面试官是不是比自己厉害,是不是啥都懂,人家是招人的,就是要招比自己厉害的人的。 还有一些人讨论问题不抓问题根源,喜欢纠结表面的东西,什么你也不懂了怎么怎么样。但是就是不去解决问题,去思考深层的东西。 写博客的好处是自己写的时候会去回忆思考,并且以后再看的时候可以加深印象理解。 所以,面试和你写不写博客没关系。 | 
|  |      28MENGKE      2021-01-13 09:45:35 +08:00 问到我不懂的,面试结束的时候我都是让面试官给我讲讲 | 
|  |      29NerverLibis      2021-01-13 09:56:31 +08:00 写博客是为了恰饭挂广告的啦,一句话让 HR 走 | 
|      30RedrumSherlock      2021-01-13 09:58:05 +08:00 via Android 虽然不怎么写博客,但是我觉得写博客最有用的是把自己理解的不全面的,浅薄,甚至错误的的给纠正补充,和自己用一个东西与教别人一个东西的区别一样 | 
|      32Flymachine      2021-01-13 10:41:27 +08:00  1 我更喜欢记笔记而不是写博客。剪藏功能是真的好使。 博客的问题是写这东东更多的是给别人看的,不自觉就会换思维方式,写起来太累了。 但写博客是个好习惯。 没必要对答不上来太紧张。我面试答不上来的题多了去了,也没影响到对方录用我。 i++的问题只要用过 C/C++写过多线程就会遇得到。C/C++没有多线程安全特性的库多了去了。就是 C++的 STL 库,比如 vector 和 string,都不是线程安全的。因为一旦考虑到多线程安全,就会损失运行效率。C/C++对此很斤斤计较,越是通用的库,越计较。于是你看到很多基于 C/C++的高级语言,比如说 PHP,会有两个版本——Non Thread Safe 和 Thread Safe,就是这种情况的体现。 至于楼上那些依赖于编译器优化的做法,老实说不太符合编程规范中对“可移植性”的要求。语言标准里未有规定,需要依赖于编译器实现的行为,属于“Undefined Behaviour” (未定义行为, 简称 UB)。这种“黑科技”不是不能用,因为确实可以节省开发精力,提升运行效率。但你必须要知道这种东西对“可移植性”的破坏,然后小心谨慎地去使用它们。一般来说,UB 能不用最好不用。 | 
|  |      33keakon      2021-01-13 10:48:50 +08:00 Python 没有 i++ 啊 | 
|  |      34Wincer      2021-01-13 11:27:33 +08:00 楼主说的是 `n += 1` 吧,n += 1 会被解释成先计算 n+1 的值保存在中间变量里面,然后再将这个变量重新赋值给 n,这个操作最少包含两个步骤,自然不是多线程安全的。 | 
|  |      35kingfalse      2021-01-13 11:59:05 +08:00 自建博客,月均一篇 | 
|      36guochao      2021-01-13 12:09:25 +08:00  1 具体的知识点线程安全这个属于八股了,最好理解一下代码执行都发生了什么。 博客这个,如果是作为摘抄本,是很没有必要的。经常能看到 CSDN 上面一天更新 20 篇博客,一看内容都是抄的那种,意义不大。实际上也非常厌恶这种,包括不作为的平台,因为这种垃圾生产者经常会把有价值的东西埋起来。有的博客写的非常随意,几行文字,没有任何具体的信息,也不大喜欢,因为信息总是有适用的场景的,A 解决的问题同样的方法给 B 不一定可以用。 博客的意义在于两点,对其他人来说是共享知识的重要的途径,对于自己来说是重新审视、重新理解学过的知识的非常好的机会。 我家里面我爹是做土木的,从小给我讲数学物理就是,先讲清楚 prerequisite,提出问题以后逐步引入新的方法或者概念,然后深入,最后留出来一个引子,让我自己朝着更深的方向做尝试。大学以后开始给别人讲东西,多多少少参照了我爹的想法,都是先一点点往回退到对方不会的地方,然后一点点引出来新的东西。再到后来写博客,虽然很多东西没有写出来,但是实际来说一篇博客从想到 idea 到写出来文章,读资料需要三天到一周写只需要一天两天,麻烦的可能从想到问题到写出来东西需要半年。文章的话一般就是问题、prequisite 、解决方法、总结的结构,作为技术博客一般也够了。 | 
|      37hitmanx      2021-01-13 12:12:49 +08:00  1 @Flymachine 话说“费曼学习法”的核心就是通过向一个一点不懂的人解释清楚一件事,来督促自己整理和消化学到的知识,其实本质上和写博客是一样的。 | 
|      38Austaras      2021-01-13 14:09:33 +08:00 说白了别写自己都没搞懂的东西装逼,很难吗? | 
|  |      39zzzmh      2021-01-13 14:11:39 +08:00 我写的都可以被问。。。因为写的都特别浅显,不太写底层。。。 | 
|      40tankren      2021-01-13 14:12:09 +08:00 你那个是写的还是转的。。 | 
|  |      41a719031256      2021-01-13 15:15:37 +08:00  2 我写博客纯粹是当记事本用,东西多了记不住,只能写道博客里,需要时方便查找 | 
|  |      42sheen      2021-01-13 15:18:16 +08:00 @zhuangzhuang1988 我感觉写博客就是把自己的一些积累和理解总结一下,强化记忆,当然你要是说那种自己没用过,网上随便找的文章拼凑的确实没啥用 | 
|  |      43samin      2021-01-13 17:24:53 +08:00 | 
|      44yamasa      2021-01-13 17:30:19 +08:00 不明白 i++线程不安全说明你 CS 基础需要恶补,真的;经不住往底层问的经验,不要在面试的时候提。面试就是这样,你越写精通什么,越要有心理准备,不要打肿脸充胖子,不会就是不会。 | 
|  |      45ruanimal      2021-01-13 17:33:15 +08:00 python 是线程安全的啊 | 
|  |      46Desiree      2021-01-13 17:42:14 +08:00 博客只是写给自己看的,本来给别人看就是附加分,说没用的,也在理,记录知识,博客只是一种方式,并不是结果。 | 
|  |      48ruanimal      2021-01-13 18:25:54 +08:00 | 
|  |      49keepeye      2021-01-13 18:27:55 +08:00 这应该涉及到汇编指令非原子操作 | 
|  |      50lewis89      2021-01-13 18:50:13 +08:00 @p2pCoder #10 不算 8 股文吧,你有兴趣可以研究我 这个博文,保障 可见性  还是有很多需要知晓 并理解的地方 https://www.cnblogs.com/jon-winters/p/14237940.html | 
|      51Flymachine      2021-01-14 09:31:49 +08:00 @hitmanx 啊,没错。但这么搞博客太累人了,而自己记笔记只要自己能看得懂就行。相较于博客,我更喜欢在公司内部开分享会,准备周期更长,更系统,还有真人提问,查漏补缺的效果更好。就是周期太长... |