当前位置: 首页 > 面试题库 >

如何实现无锁但阻塞的行为?

姚实
2023-03-14
问题内容

我正在为密集型网络应用程序实现无锁的单一生产者单一使用者队列。我有一堆工作线程在各自独立的队列中接收工作,然后它们将出队并进行处理。

从这些队列中删除锁可以极大地提高高负载下的性能, 但是当队列为空时它们不再阻塞 ,从而导致CPU使用率猛增。

我如何有效地使线程阻塞,直到它可以成功出队或被杀死/中断?


问题答案:

如果您使用的是Linux,请考虑使用Futex。它通过使用原子操作而不是像互斥锁那样的内核调用来提供非锁定实现的性能,但是如果由于某些条件不正确(例如,锁争用)而需要将进程设置为空闲时,它将实现然后进行适当的内核调用以使进程进入睡眠状态,并在以后的事件中将其唤醒。基本上就像一个非常快的信号灯。



 类似资料:
  • 问题内容: 考虑以下代码: 我了解在上面的代码中,如果拥有同步块的所有权,并且同时如果线程尝试获取同步块,则需要内核等待。我想避免这种情况,并在块之前旋转,直到调用等待并离开该块的所有权为止。那可能吗? 问题答案: JVM无需将进入锁定的同步块的步骤实现为硬块和上下文切换。它可以选择使用重量更轻的方法,例如旋转锁。实际上,Oracle JVM竭尽所能避免阻塞。因此,您可能会发现JVM已经为您完成了

  • 基本问题:Spring反应器WebClient如何实现非阻塞时,与RestTem板相比?在将请求发送到外部服务(例如)后,它是否必须在某个地方阻塞?HTTP本质上是同步的,对吗?所以调用应用程序必须等待响应?线程如何知道上下文,以便对来自服务的响应做出反应?

  • 目前我们有LinkedBlockingQueue和Con的LinkedQueue。 LinkedBlockingQueue可以有界,但它使用锁。 ConcurrentLinkedQueue不使用锁,但它不受限制。而这并不是阻碍投票的原因。 显然,我不能有一个既阻塞又无锁的队列(无等待或非阻塞或其他东西)。我不要求学术定义。 有人知道一个队列实现,它基本上是无锁的(不在热路径中使用锁),空时阻塞(不

  • 本文向大家介绍nodejs中实现阻塞实例,包括了nodejs中实现阻塞实例的使用技巧和注意事项,需要的朋友参考一下 node.js中与生俱来的单线程编程、回调函数异步式风格让我们有时喜有时忧。先说单线程,很多人会费解于node.js的单线程如何能做到高并发?这个问题不是本文重点,点到为止。澄清一点,node.js的单线程仅仅指javascript引擎是单线程的,无论如何我们没有办法在javascr

  • Java Future对象用于获取由并行线程(执行器)执行的异步计算的结果。我们调用Future.get()方法并等待结果就绪。此示例显示了一种从Future检索结果的非阻塞方式。java实现java非阻塞未来。 在本例中,在并行执行完成后调用onSuccess()方法。问题在于onSuccess()方法未在主线程上运行。我想在主线程上执行onSuccess()方法。我怎样才能解决这个问题。谢谢

  • 这一次,第一个选项卡将等待5秒,第二个选项卡将等待10秒 为什么会这样?