在我的主线程中,我有一个while(listening)调用accept()我的ServerSocket对象的循环,然后启动一个新的客户端线程,并在接受新客户端时将其添加到Collection.
我还有一个Admin线程,我想用它来发出命令,比如'exit',这将导致所有客户端线程被关闭,自行关闭,并通过转向监听来关闭主线程.
但是,accept()在while(listening)循环块中调用,并且似乎没有任何方法可以中断它,因此无法再次检查while条件并且程序无法退出!
有一个更好的方法吗?或者某种方式来中断阻塞方法?
在低级语言(C,C++或其他)中:我可以选择在拥有一堆互斥(如pthread给我或者本机系统库提供的内容)或者对象的单个互斥之间.
锁定互斥锁的效率如何?即可能有多少汇编指令,以及它们花了多少时间(在互斥锁解锁的情况下)?
互斥量需要多少钱?真的有很多互斥体是一个问题吗?或者我可以在代码中抛出尽可能多的互斥变量,因为我有int变量并且它并不重要?
(我不确定不同硬件之间有多大差异.如果有,我也想了解它们.但大多数情况下,我对常见的硬件感兴趣.)
关键是,通过使用许多互斥体,每个互斥体只覆盖对象的一部分而不是整个对象的单个互斥体,我可以安全地使用许多块.我想知道我应该走多远.即我应该尽可能地尝试保护任何可能的块,无论多么复杂和多少互斥量这意味着什么?
关于锁定的WebKits博客文章(2016)与此问题非常相关,并解释了自旋锁,自适应锁,futex等之间的差异.
我在网上搜索了一些关于阻止I/O和非阻塞I/O的技术细节,我发现有几个人说非阻塞I/O比阻塞I/O更快.例如,在本文档中.
如果我使用阻塞I/O,那么当然阻塞的线程当然不会做任何其他事情......因为它被阻止了.但是一旦线程开始被阻塞,操作系统就可以切换到另一个线程而不会切换回来,直到阻塞的线程有事情要做.因此,只要系统上有另一个需要CPU并且没有被阻塞的线程,与基于事件的非阻塞方法相比,不应该有更多的CPU空闲时间,是吗?
除了减少CPU空闲时间之外,我还看到了另外一个选项,可以增加计算机在给定时间范围内可以执行的任务数量:减少切换线程所带来的开销.但是怎么做呢?并且开销是否足以显示可衡量的影响?以下是关于如何将其工作的想法:
它是如何工作的?如果没有,它是如何工作的?这意味着事件系统可以在不需要显式触摸堆栈的情况下工作(例如需要备份堆栈并在切换线程时将另一个线程的堆栈复制到内存中的真实调度程序)?这实际节省了多少时间?还有更多吗?
我有一个从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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是使用此类处理对象的方法:
public void testHandler() {
BlockingQueue<MyObj> queue = new ArrayBlockingQueue<MyObj>(100);
MyObjectHandler handler = new MyObjectHandler(queue);
new Thread(handler).start();
// get objects for handler to process …Run Code Online (Sandbox Code Playgroud) 有什么区别:
可以是异步和非阻塞(以及基于事件的)吗?
在编程中最重要的是拥有一些东西:异步,非阻塞和/或事件库(或全部3)?
如果你能提供一些例子,那就太棒了.
这个问题正在被问到,因为我正在阅读关于类似主题的这篇伟大的StackOverflow文章,但它没有回答我上面的问题.
asynchronous programming-languages event-based-programming nonblocking blocking
在iOS 5中,NSManagedObjectContext有几种新方法,performBlock:和performBlockAndWait:.实际使用的这些方法是什么?它们在旧版本中取代了什么?什么样的街区应该传递给他们?我该如何决定使用哪个?如果有人有一些使用它们的例子,那就太好了.
如何从控制台python应用程序轮询键盘?具体来说,我想在许多其他I/O活动(套接字选择,串行端口访问等)中做类似的事情:
while 1:
# doing amazing pythonic embedded stuff
# ...
# periodically do a non-blocking check to see if
# we are being told to do something else
x = keyboard.read(1000, timeout = 0)
if len(x):
# ok, some key got pressed
# do something
Run Code Online (Sandbox Code Playgroud)
在Windows上执行此操作的正确pythonic方法是什么?此外,Linux的可移植性也不错,但并不是必需的.
如果你使用过gui工具包,你就知道有一个事件循环/主循环应该在一切完成后执行,这将使应用程序保持活跃并响应不同的事件.例如,对于Qt,您可以在main()中执行此操作:
int main() {
QApplication app(argc, argv);
// init code
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,app.exec()是应用程序的主循环.
实现这种循环的显而易见的方法是:
void exec() {
while (1) {
process_events(); // create a thread for each new event (possibly?)
}
}
Run Code Online (Sandbox Code Playgroud)
但是这会将CPU限制在100%并且实际上是无用的.现在,我如何实现这样一个响应的事件循环,而不必完全占用CPU?
回答在Python和/或C++中受到赞赏.谢谢.
脚注:为了学习,我将实现自己的信号/插槽,我会用它们来生成自定义事件(例如go_forward_event(steps)).但是如果你知道如何手动使用系统事件,我也想知道这一点.
InputStream.available()在Java中做什么?我阅读了文档,但我还是无法解决.
医生说:
返回可以从此输入流中读取(或跳过)的字节数,而不会被此输入流的方法的下一个调用方阻塞.下一个调用者可能是同一个线程或另一个线程.
类InputStream的可用方法始终返回0.
阻止是什么意思?它只是意味着同步通话吗?
最重要的是,该available()方法的目的是什么?
blocking ×10
java ×3
nonblocking ×3
asynchronous ×2
interrupt ×2
python ×2
c++ ×1
concurrency ×1
console ×1
core-data ×1
event-loop ×1
inputstream ×1
io ×1
ios ×1
ios5 ×1
keyboard ×1
locking ×1
mutex ×1
networking ×1
synchronous ×1