这是对我之前的问题的延伸
我现在从互联网收集的内容,所有调用阻塞调用的进程都会进入休眠状态,直到调度程序找到解除阻塞的原因.原因可以从缓冲区空到缓冲区满到任何其他条件.
但是,这可以成为实时的有效方式,让我们说硬/实时应用程序?由于当解除阻塞条件成立时,进程未被解锁,而是当调度程序给出他的CPU切片时,并且解除阻塞条件都为真.
好像你想要一个响应式解决方案,我不这样做"旋转锁"或"忙等待"是正确的方法,CPU切片被浪费,整个系统将无法响应或可能响应不佳.
有人可以清楚这个相互矛盾的想法.
我想在我的应用程序中等待一个应该立即发生的事件,所以我不想让我的线程等待并稍后唤醒它。我想知道使用Sleep(0)和硬件暂停指令有什么区别。
我看不到以下程序的 CPU 利用率有任何差异。我的问题不是关于省电的考虑。
#include <iostream>
using namespace std;
#include <windows.h>
bool t = false;
int main() {
while(t == false)
{
__asm { pause } ;
//Sleep(0);
}
}
Run Code Online (Sandbox Code Playgroud) 在过去的几天里,我读了一些有关无锁编程的知识,我遍历了util.java.Random该类,并使用以下例程创建了它:
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
Run Code Online (Sandbox Code Playgroud)
根据这个 SO答案:
所谓的无锁算法倾向于对CAS指令使用严格的忙等待,但是在通常情况下竞争很低,以至于CPU通常只需要迭代几次。
和维基百科:
研究人员发现,在CAS处理失败后,无需立即重试,而是可以提高多处理器系统的整体系统性能,在多处理器系统中,如果看到CAS失败的线程使用指数退避,则许多线程会不断更新某些特定的共享变量,换句话说,请等待重试CAS之前需要一点时间。[4]
维基百科文章是否可以理解,已经找到但尚未使用,或者CAS指令在失败后人为地退缩是常见的做法。这是因为这样的循环对于cpu的使用不被认为是危险的,还是因为CAS一直没有引起争议?
第二个问题:是否有seed创建引用的特定原因,还是我们也可以简单地使用类作用域中的变量?