标签: blocking

为什么FileInputStream read()没有阻塞?

我有一个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)

java file blocking fileinputstream

5
推荐指数
1
解决办法
2994
查看次数

套接字是否应该是非阻塞的,以便在Python中使用select?

  1. select.select在Python中使用时,套接字是否应设置为非阻塞?
  2. 它们有或没有什么区别?

偶尔我发现调用send一个返回sendable的套接字会阻塞.此外,我发现阻塞套接字通常会发送给定的整个缓冲区(128 KiB).在非阻塞模式下,发送将接受更少的字节(与前面给出的示例相比为20-40 KiB)并且返回更快.我在Lucid上使用Python 3.1.

python sockets select blocking python-3.x

5
推荐指数
1
解决办法
944
查看次数

阻止队列的这种实现安全吗?

我正在尝试实现一个队列,如果它是空的,则阻塞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)

一些解释到期:

  • CCriticalSection是Windows Critical Section的包装器,Enter和Leave方法是私有的,CGuard是它唯一的朋友
  • CGuard是CCriticalSection的RAII包装器,在构造函数上输入关键部分,将它留在析构函数上
  • CEvent是Windows事件的包装器,wait使用WaitForSingleObject函数
  • 我不介意元素按值传递,它们是小对象
  • 我不能使用Boost,只是Windows的东西(因为我已经在使用CEvent和CGuard)

我担心使用Pop()时可能会出现一些奇怪的竞争情况.你们有什么感想?

更新:由于我正在使用Visual Studio 2010(.NET 4.0),我最终使用了C++运行时提供的unbounded_buffer类.当然,我使用Pointer to Implementation Idiom(Chesire Cat)将它包装在一个类中,以防我们决定更改实现或需要将此类移植到另一个环境

c++ windows queue concurrency blocking

5
推荐指数
1
解决办法
945
查看次数

在事件队列被阻止时,Node.js服务器是否可以接受传入请求?

所以我刚刚开始深入了解Node,我知道I/O是非阻塞的,并且事件循环是阻塞的,但我想知道的是:

如果您有阻止事件队列的代码,服务器是否仍然能够将传入的请求放在队列的末尾,或者所有这些请求都只是超时/反弹?

blocking node.js

5
推荐指数
2
解决办法
1702
查看次数

使用命令行工具确定阻止OSX进程的内容?

标题说得最多,真的.在Linux上这将是很容易strace和可能的lsof/proc,并用它很容易在OSX,直到truss从OSX Leopard的去除,与潜在的系统调用(据我所知)一起.

显而易见的方法是用这个问题来解决这个问题dtrace,但据我所知,dtrace这不会做,因为它会在事件发生时捕获事件 - 在我的情况下,阻塞系统调用已经开始了.dtrace顺便说一下,如果可以解决这个问题,我很乐意做出纠正.

我看到Xcode的仪器有一个监视器,通过定期处理进程堆栈的样本来实现类似的东西(不确定系统调用依赖于它做什么!),也许在命令行上类似的东西就足够了(因为它会显示堆栈一直到包含系统调用的库调用).为了对我的用例有用,这个"采样命令行工具"必须找到并解析它在堆栈上找到的参数,以便确定我们阻止了哪些文件/文件描述符.

最后一件事 - 在Linux上,你通常可以做普通用户(假设没有ptrace_scope技巧).如果OSX解决方案也不需要root,那将是很好的.

macos dtrace blocking instruments strace

5
推荐指数
1
解决办法
1541
查看次数

在Java/Android中查找需要花费一秒或更多时间执行的方法的最快/最简单的方法

我试图弄清楚哪些方法(主线程上的esp)花了一秒多的时间来执行.不幸的是我使用DDMS和traceview,但我真的不明白如何阅读提供的数据.有没有一种简单的方法来找到长时间运行的方法?

java android nonblocking blocking

5
推荐指数
4
解决办法
1707
查看次数

实体框架可以选择阻止表吗?

我听说SQL Server SELECT语句导致阻塞

因此,我有带有EF和SQL Server 2008的MVC应用程序,并且它与另一个经常写入一些数据的应用程序共享数据库。MVC应用程序会基于来自另一个应用程序的数据生成一些实时报告。

因此,考虑到这种情况,是否有可能在生成报告时阻止某些应用程序试图写入数据的表?

我尝试在生成报表时进行一些手动插入和更新,并且处理起来还不错。我误会了吗?

sql sql-server performance entity-framework blocking

5
推荐指数
1
解决办法
2130
查看次数

在Go中取消阻止操作

我在第三方库中有一个我无法控制的阻塞操作.它可能会永远消失.所以我想设置一个超时.显而易见的方法是用通道和goroutine包装它,然后选择结果time.After.然而,问题是运行阻塞操作的goroutine可能会永远存在.

这是一个例子来说明这个http://repl.it/90o

有没有办法取消goroutine或收集垃圾?

timeout go blocking goroutine

5
推荐指数
1
解决办法
1161
查看次数

IO的“最佳” ExecutionContext

我的Scala代码中有一些同步调用。我将它们包装在blocking()上下文中,然后在Future中:Future(blocking(syncCall())),但是我不知道要使用哪种类型的ExecutionContext。

我知道可能存在很多可能性,并且没有ExecutionContext是“最佳”的。我只需要一些信息,以免选择最差的一种,因为那里有很多信息,而且我头上一团糟。

io scala blocking executioncontext

5
推荐指数
0
解决办法
472
查看次数

在用于暂停线程时,循环Thread.Sleep()会不会对性能造成影响?

有(或者已经有)很多关于使用该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)

c# vb.net multithreading blocking thread-sleep

5
推荐指数
1
解决办法
626
查看次数