一转眼到深圳已经马上7个月了,这才适应得差不多,有点儿慢热哈~到这边运动量减少、坐的时间加长,体重变化不大,但是体脂率上来了。长此以往不行啊,潜入了一个羽毛球群,争取每周打一次羽毛球,基本上打不过群里那些人……
工作节奏适应后,接下来是减少玩手机的频率。白天看电脑的时间已经很长了,回来再长时间看手机,偶尔第二天下午眼睛会不舒服。
C++新特性知识的萃取,股票复盘,投资经验的review,对特定方向持续且深入的思考,当前经济形势下,如何“苟住”,是否有新的机会可以把握。

接下来是今天学习成果的分享。
很久之前对多线程编程进行过学习,参考书是——《POSIX多线程程序设计中文版》(于雷、曾刚译)。学到条件变量那,之后没再继续。后来一直有一个问题——注册一个获取机械臂当前位姿的回调函数,回调函数中将位姿信息拷贝到类内对应变量,如果另外一个线程使用类内的这个变量,会不会有问题?
问题点在于如果读到的是完整的旧数据或者完整的新数据,都是ok的,会不会读到部分新数据部分旧数据的“撕裂数据”?经过网络零散的查找,确定确实是有问题的,尤其在Arm这种弱内存模型上。
但在网上搜索的多是零言碎语,不成体系——内存屏障、lock-free、cache命中等,所以今天又翻了上面的书,虽不能完全解惑,但还是有不少收获的、
线程间的内存可视性
线程世界中的“同步”到底意味着什么。同步不仅仅意味着防止两个线程同时写数据,当然这也是同步的部分工作。同步是关于线程如何看待计算机内存的。
Pthreads提供了关于内存可视性的一些规则如下:
1.线程调用pthread_create时,它所看见的内存值也是它建立的线程能够看到的。任何在调用pthread_create之后向内存写入的数据,可能不会被建立的线程看到,即使写操作发生在启动新线程之前。
2.当线程解锁互斥量时看到的内存中的数据,同样也能被后来直接锁住(或通过等待条件变量锁住)相同互斥量的线程看到。同样,在解锁互斥量之后写入的数据不必被其他线程看到,即使写操作发生在其他线程锁互斥量之前。
主要是第二点哈,后面还有两点不抄了。
当两个线程一个接一个地向同一内存地址写不同数据时,最终的结果就像是一个线程按照相同的顺序写两次一样。在这两种情况下,都只有一个值保存在内存中。问题在于如何知道哪个写操作最后发生。例,处理器A先写入1,几个微妙后处理器B写入2,但这并不意味着最终的结果是“2”。后面先略过高速缓存和内存总线的工作流程,直接看结论先,

今天到这里了~
欢迎关注:
5248

被折叠的 条评论
为什么被折叠?



