Questions tagged «blocking»


5
锁定未锁定的互斥锁的效率如何?互斥锁的成本是多少?
在低级语言(C,C ++或任何其他语言)中:我可以选择是否拥有一堆互斥对象(例如pthread给我的东西或本机系统库提供的东西)或一个对象的单个对象。 锁定互斥锁的效率如何?即可能有多少个汇编程序指令,它们需要多少时间(在互斥锁未锁定的情况下)? 互斥锁的成本是多少?确实有很多互斥体是一个问题吗?还是我可以在代码中抛出与变量一样多的互斥量int变量,这并不重要吗? (我不确定不同的硬件之间有多少区别。如果有,我也想知道它们。但是大多数情况下,我对通用硬件很感兴趣。) 关键是,通过使用许多互斥量(每个互斥量仅覆盖对象的一部分)而不是整个对象的单个互斥量,我可以保护很多块。我想知道我应该走多远。即我应该尽可能真正地保护任何可能的块,无论这意味着多少复杂和多少互斥量? WebKits博客文章(2016)中有关锁定的问题与该问题非常相关,并解释了自旋锁,自适应锁,futex等之间的区别。

8
如何中断ServerSocket accept()方法?
在主线程中,有一个while(listening)循环,该循环调用accept()ServerSocket对象,然后启动新的客户端线程,并在接受新客户端时将其添加到Collection中。 我也有一个Admin线程,我想使用它发出诸如“ exit”之类的命令,这将导致所有客户端线程被关闭,关闭自身并通过侦听false关闭主线程。 但是,循环中的accept()调用会while(listening)阻塞,并且似乎没有任何方法可以中断它,因此,无法再次检查while条件,并且程序无法退出! 有一个更好的方法吗?还是以某种方式来中断阻塞方法?

9
非阻塞I / O真的比多线程阻塞I / O快吗?怎么样?
我在网上搜索了有关阻止I / O和非阻止I / O的一些技术细节,我发现一些人指出,非阻止I / O比阻止I / O更快。例如在本文档中。 如果我使用阻塞I / O,那么当前被阻塞的线程当然不能做任何其他事情……因为它被阻塞了。但是,一旦某个线程开始被阻塞,操作系统就可以切换到另一个线程,而不必切换回另一个线程,直到对该阻塞的线程有必要做些事情为止。因此,与基于事件的非阻塞方法相比,只要系统上还有另一个线程需要CPU并且未被阻塞,那么CPU空闲时间就不会更多了? 除了减少CPU空闲时间以外,我还看到了另一个选择,可以增加计算机在给定时间范围内可以执行的任务数量:减少切换线程带来的开销。但是如何做到这一点?开销是否足够大以显示可衡量的效果?这是关于如何描述其工作原理的想法: 要加载文件的内容,应用程序将此任务委托给基于事件的I / O框架,并传递回调函数和文件名。 事件框架委托给操作系统,该操作系统对硬盘的DMA控制器进行编程,以将文件直接写入内存 事件框架允许进一步的代码运行。 在完成磁盘到内存的复制后,DMA控制器将引起中断。 操作系统的中断处理程序将基于事件的I / O框架通知文件已完全加载到内存中。它是如何做到的?使用信号?? 事件I / O框架中当前运行的代码完成。 基于事件的I / O框架检查其队列,并查看步骤5中的操作系统消息,并执行在步骤1中获得的回调。 那是怎么回事?如果没有,它如何工作?这意味着事件系统可以工作而无需显式地触摸堆栈(例如,真正的调度程序需要在切换线程时备份堆栈并将另一个线程的堆栈复制到内存中)?这实际上节省了多少时间?还有更多吗?

5
异步,非阻塞,基于事件的体系结构之间有什么区别?
之间有什么区别: 异步, 非阻塞,和 基于事件的架构? 事物既可以是异步的又可以是非阻塞的(基于事件的)吗? 在编程中,最重要的是要拥有一些东西:异步,非阻塞和/或基于事件的(或全部基于3个)? 如果您可以提供示例,那就太好了。 有人问这个问题是因为我在阅读有关类似主题的出色StackOverflow文章,但没有回答我上面的问题。

6
如何中断在take()上阻塞的BlockingQueue?
我有一个类,该类从a获取对象BlockingQueue并通过take()连续循环调用来处理它们。在某些时候,我知道不会再有其他对象添加到队列中。如何中断该take()方法以使其停止阻塞? 这是处理对象的类: public class MyObjHandler implements Runnable { private final BlockingQueue<MyObj> queue; public class MyObjHandler(BlockingQueue queue) { this.queue = queue; } public void run() { try { while (true) { MyObj obj = queue.take(); // process obj here // ... } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.