我有一个Writer程序,它将一行文本写入文件,然后等待用户在写入另一行之前返回,然后退出.只有在那之后文件才关闭.代码:
public class Writer {
Writer() {
}
public static String[] strings =
{
"Hello World",
"Goodbye World"
};
public static void main(String[] args)
throws java.io.IOException {
java.io.FileOutputStream pw =
new java.io.FileOutputStream("myfile.txt");
for(String s : strings) {
pw.write(s.getBytes());
System.in.read();
}
pw.close();
}
}
Run Code Online (Sandbox Code Playgroud)
首先开始:
java作家
然后我还有一个读者程序,只要文件的写入尚未完成(即尚未调用pw.close()),应该(我预期)阻止.代码:
public class ReaderFIS extends Object {
ReaderFIS() {
}
public static void main(String[] args) throws Exception {
java.io.FileInputStream in = new java.io.FileInputStream("myfile.txt");
int ch = -1;
while((ch = in.read()) >= 0) {
System.out.println("ch = …Run Code Online (Sandbox Code Playgroud) select.select在Python中使用时,套接字是否应设置为非阻塞?偶尔我发现调用send一个返回sendable的套接字会阻塞.此外,我发现阻塞套接字通常会发送给定的整个缓冲区(128 KiB).在非阻塞模式下,发送将接受更少的字节(与前面给出的示例相比为20-40 KiB)并且返回更快.我在Lucid上使用Python 3.1.
我正在尝试实现一个队列,如果它是空的,则阻塞Pop操作,并在推送新元素时立即解除阻塞.我担心我可能会遇到一些竞争条件; 我试着看看其他一些实现,但我发现大多数是在.NET中完成的,而我发现的少数C++在很大程度上依赖于其他库类.
template <class Element>
class BlockingQueue{
DRA::CommonCpp::CCriticalSection m_csQueue;
DRA::CommonCpp::CEvent m_eElementPushed;
std::queue<Element> m_Queue;
public:
void Push( Element newElement ){
CGuard g( m_csQueue );
m_Queue.push( newElement );
m_eElementPushed.set();
}
Element Pop(){
{//RAII block
CGuard g( m_csQueue );
bool wait = m_Queue.empty();
}
if( wait )
m_eElementPushed.wait();
Element first;
{//RAII block
CGuard g( m_csQueue );
first = m_Queue.front();
m_Queue.pop();
}
return first;
}
};
Run Code Online (Sandbox Code Playgroud)
一些解释到期:
我担心使用Pop()时可能会出现一些奇怪的竞争情况.你们有什么感想?
更新:由于我正在使用Visual Studio 2010(.NET 4.0),我最终使用了C++运行时提供的unbounded_buffer类.当然,我使用Pointer to Implementation Idiom(Chesire Cat)将它包装在一个类中,以防我们决定更改实现或需要将此类移植到另一个环境
所以我刚刚开始深入了解Node,我知道I/O是非阻塞的,并且事件循环是阻塞的,但我想知道的是:
如果您有阻止事件队列的代码,服务器是否仍然能够将传入的请求放在队列的末尾,或者所有这些请求都只是超时/反弹?
标题说得最多,真的.在Linux上这将是很容易与strace和可能的lsof或/proc,并用它很容易在OSX,直到truss从OSX Leopard的去除,与潜在的系统调用(据我所知)一起.
显而易见的方法是用这个问题来解决这个问题dtrace,但据我所知,dtrace这不会做,因为它会在事件发生时捕获事件 - 在我的情况下,阻塞系统调用已经开始了.dtrace顺便说一下,如果可以解决这个问题,我很乐意做出纠正.
我看到Xcode的仪器有一个监视器,通过定期处理进程堆栈的样本来实现类似的东西(不确定系统调用依赖于它做什么!),也许在命令行上类似的东西就足够了(因为它会显示堆栈一直到包含系统调用的库调用).为了对我的用例有用,这个"采样命令行工具"必须找到并解析它在堆栈上找到的参数,以便确定我们阻止了哪些文件/文件描述符.
最后一件事 - 在Linux上,你通常可以做普通用户(假设没有ptrace_scope技巧).如果OSX解决方案也不需要root,那将是很好的.
我试图弄清楚哪些方法(主线程上的esp)花了一秒多的时间来执行.不幸的是我使用DDMS和traceview,但我真的不明白如何阅读提供的数据.有没有一种简单的方法来找到长时间运行的方法?
因此,我有带有EF和SQL Server 2008的MVC应用程序,并且它与另一个经常写入一些数据的应用程序共享数据库。MVC应用程序会基于来自另一个应用程序的数据生成一些实时报告。
因此,考虑到这种情况,是否有可能在生成报告时阻止某些应用程序试图写入数据的表?
我尝试在生成报表时进行一些手动插入和更新,并且处理起来还不错。我误会了吗?
我在第三方库中有一个我无法控制的阻塞操作.它可能会永远消失.所以我想设置一个超时.显而易见的方法是用通道和goroutine包装它,然后选择结果time.After.然而,问题是运行阻塞操作的goroutine可能会永远存在.
这是一个例子来说明这个http://repl.it/90o
有没有办法取消goroutine或收集垃圾?
我的Scala代码中有一些同步调用。我将它们包装在blocking()上下文中,然后在Future中:Future(blocking(syncCall())),但是我不知道要使用哪种类型的ExecutionContext。
我知道可能存在很多可能性,并且没有ExecutionContext是“最佳”的。我只需要一些信息,以免选择最差的一种,因为那里有很多信息,而且我头上一团糟。
有(或者已经有)很多关于使用该Thread.Sleep()方法的好坏的讨论.据我所知,它主要用于调试目的.
现在我想知道:用于我的特定目的是不是很糟糕,也就是说,不断循环它以便能够暂停/恢复线程?我这样做是因为我想暂停一个执行I/O操作的线程,并能够以一种简单的方式恢复它.
I/O操作基本上只是将4096字节的块写入文件,直到所有数据都写入其中.由于文件可能很大并且需要很长时间,我希望能够暂停操作(以防它开始吃掉很多系统资源).
我的代码,VB.NET版本:
'Class level.
Private BytesWritten As Long = 0
Private Pause As Boolean = False
'Method (thread) level.
While BytesWritten < [target file size]
...write 4096 byte buffer to file...
While Pause = True
Thread.Sleep(250)
End While
...do some more stuff...
End While
Run Code Online (Sandbox Code Playgroud)
C#等价物:
//Class level.
long bytesWritten = 0;
bool pause = false;
//Method (thread) level.
while(bytesWritten < [target file size]) {
...write 4096 byte buffer to file...
while(pause == true) {
Thread.Sleep(250);
} …Run Code Online (Sandbox Code Playgroud) blocking ×10
java ×2
android ×1
c# ×1
c++ ×1
concurrency ×1
dtrace ×1
file ×1
go ×1
goroutine ×1
instruments ×1
io ×1
macos ×1
node.js ×1
nonblocking ×1
performance ×1
python ×1
python-3.x ×1
queue ×1
scala ×1
select ×1
sockets ×1
sql ×1
sql-server ×1
strace ×1
thread-sleep ×1
timeout ×1
vb.net ×1
windows ×1