忙等,yield(),死循环,原子atomic
1)忙等
忙等是一种编程技术,其中一个线程不断地检查某个条件是否满足,而不使用阻塞式等待(如条件变量)。
这种方式可能导致 CPU 占用率非常高,因为线程一直在运行,即使没有实际的工作要做
for (;😉
{
if (val > 10)
{
//dosomething
}
else {
std::this_thread::yield();
}
}
std::this_thread::yield() 在忙等中的作用
提示调度器:std::this_thread::yield() 会向操作系统调度器发送一个信号,表示当前线程愿意放弃其剩余的 CPU 时间片。
调度器可以决定将 CPU 时间片分配给其他等待执行的线程。
减少 CPU 占用率:通过定期调用 std::this_thread::yield(),忙等循环可以减少对 CPU 的占用,从而让其他线程有更多的机会执行。
提高系统响应性:在多线程环境中,定期让出 CPU 可以提高系统的整体响应性,确保其他高优先级任务能够及时得到处理。
2)使用其他同步机制(条件变量)
虽然 std::this_thread::yield() 可以减少 CPU 的浪费,但在某些情况下,忙等仍然是低效的。
如果条件满足的时间较长,使用条件变量(std::condition_variable)或其他同步机制可能会更高效。
std::condition_variable 用于阻塞主线程,直到条件满足为止。这种方式比忙等更高效,因为它不会浪费 CPU 资源。
3)原子atomic
在无锁编程中也是一种死循环的实现方式
do{
new_node->next = head.load();
}while(!head.compare_exchange_strong(new_node->next, new_node));
atomic.compare_exchange_weak(expected, desired))方法:
如果当前atomic的值与expected,如果相等,将atomic的值设为desired,返回True
否则,将expected设为atomic的值,返回false
多线程中类似于自旋锁的用法