大家好,
首先很抱歉,这将是一个中等长度的帖子。所以,请耐心阅读。
在这里,我将记录一些我在浏览一些关于无锁编程的文章时学到的概念,并提出我对这种学习的疑问。
此外,讨论是在 *NIX 多处理器平台上进行的。
首先说“LOCKLESS = BLOCKLESS”,因为据说线程系统作为一个整体取得了进展,因为 CAS/DCAS 只有在某个线程取得进展时才会失败。
因此,我们可以说,在这里,如果在互斥锁上阻塞,我们正在旋转/等待一个条件(例如,CAS while 循环)。
Quest1 > 如何在 while 循环上旋转比在
互斥锁上阻塞更有效?
Quest2 > 使用互斥锁的良好设计还可以确保系统继续运行,那么
根据定义,BLOCKLESS 不也是吗?
作为对问题 1 的回答,有人会争辩说阻塞可能会进入内核等待状态,并且可能存在代价高昂的上下文切换。任何进一步的澄清将不胜感激。
好的,假设在得到前 2 个问题的答案后,我会确信当要完成的原子操作不是很大/耗时时,无锁是非常快速和实时的。
Quest3 > 那么,无锁是不是类似于 spinlock ?如果是,为什么我们不能使用
pthread 自旋锁?
展望未来,在网上的大多数文献中,人们会看到这样的原子操作实现:
__asm__ __volatile__("lock\nxadd" X " %0,%1" : "=r"(结果),"=m"(*(T *)i_pAddress) :“0”(i_addValue) : “记忆”); // 这是什么意思 ?记忆栅栏?
Quest4 > 上述汇编中的 ":memory" 是否意味着内存围栏?如果是,
那不需要大约 100 个周期来实施吗?
Quest5 > 这里的lock指令是不是断言操作是
在共享资源上进行的,所以其他线程在这里阻塞了?
据我所知,
这个问题对于或多或少最近的英特尔多进程架构无效,
因为锁定是在缓存行上完成的。
提前致谢。