Skykey
Hello,World! 👋
Hi, I’m Skykey 😉, a programmer 👨🏻💻 from China 🇨🇳. I’m an open-source profession and always develop in Cpp/Qt. Currently, I’m working on QtDocCN. Besides programming, I like delicious food 🥗🥩🌮🍣 and doing sports 🏃⛹️♂️🏋🏼♂️.
本文翻译自经典博文《An Introduction to Lock-Free Programming》,是一篇有关于无锁编程的经典文章。由于译者水平优先,如有谬误实所难免,还请指正。
很早之前写过一篇关于线程池文章,《基于C++11实现线程池》,一直被网友翻出来,对里面的一些细节实现提了许多问题。其实更推荐大家去阅读后来写的另外一篇关于线程池的文章,《当我谈线程池时我谈些什么——线程池学习笔记》。原因很简单,写第一篇线程池文章的时候,自己属实是菜的不行(现在依旧是菜的不行),花了很长时间去学习一些里面用到的C++11的新语法,文章里面讲的重点也是涉及到的C++11语法。所以,更关心线程池本身的实现的话,更适合去看新文章《当我谈线程池时我谈些什么——线程池学习笔记》,作为现代C++语法的新学者,想花更多精力在学习现代C++语法的话,适合去看老文章《基于C++11实现线程池》。
言归正传,在那篇老文章里有挺多网友提了一些std::thread
相关的问题。今天看了会cppreference,写了点代码实践了下,集中回答了一些问题,顺便水篇文章算是学习笔记了。
本文基于饶萌大佬的《Linux低延迟服务器系统调优》一文总结整理,自行补充了一些细节。大佬博文指路:
低延迟关键不在于低,而在于稳定,稳定即可预期,可掌控,这对高频领域来说尤其重要。谈及Linux低延迟技术时,人们经常提到“Kernel Bypass”(内核旁路),即绕过内核,这是因为内核处理不仅慢且延迟不稳定。因此一个延迟要求很高的实时任务是不能触碰内核的,“避免触碰”是一个比Bypass更高的要求:不能以任何方式进入内核。中断(Interrupt)是进入内核的方式之一,本文的关键点也在于避免关键线程被中断。即使中断发生时线程是空闲的,但重新回到用户态后CPU缓存被污染了,下一次处理请求的延迟也会变得不稳定。