标签: blocking

Java中的并发和阻塞队列

我有一个线程将事件推送到第二个线程的传入队列的经典问题.只有这一次,我对表现很感兴趣.我想要实现的是:

  • 我希望并发访问队列,生产者推送,接收器弹出.
  • 当队列为空时,我希望使用者阻塞队列,等待生产者.

我的第一个想法是使用a LinkedBlockingQueue,但我很快意识到它不是并发的,而且性能受到了影响.在另一方面,我现在使用ConcurrentLinkedQueue,但还是我付出的成本wait()/ notify()每本出版物上.由于消费者在找到空队列时没有阻止,因此我必须同步并wait()锁定.另一方面,制作人必须获得锁定并notify()在每一个出版物上.总体结果是sycnhronized (lock) {lock.notify()},即使不需要,我也会支付每一份出版物的费用 .

我猜这里需要的是一个阻塞和并发的队列.我想象一个push()操作工作ConcurrentLinkedQueue,notify()当推送元素是列表中的第一个时,对象的额外内容.这种检查我认为已经存在ConcurrentLinkedQueue,因为推动需要连接下一个元素.因此,这比每次在外部锁上同步要快得多.

是这样的/合理的吗?

java queue concurrency blocking

27
推荐指数
3
解决办法
3万
查看次数

ASP.net会话请求排队

在我看来,ASP.net排队使用相同会话ID的所有请求.假设你有3页.

Default.aspx的

protected void Page_Load(object sender, EventArgs e)
{
    Session["asdf"] = "LOLZ";
}
Run Code Online (Sandbox Code Playgroud)

如果不存在,点击此页面显然会创建一个新会话.

X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=ibjphuv0aiafqi453tyze345; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)

然后你点击Hang.aspx

protected void Page_Load(object sender, EventArgs e)
{
    Thread.Sleep(10000);
}
Run Code Online (Sandbox Code Playgroud)

在你点击任何其他页面后会立即传递此会话ID,无论它是否有任何作用,我们称之为Test.aspx.

加载的顺序是这样的.

Request            Timeline
"GET /"            |*|
"GET /Hang.aspx"       |******************************************|
"GET /Test.aspx"            |**************************************|
Run Code Online (Sandbox Code Playgroud)

我想我的问题是如何禁用此功能.我知道让会话状态更可预测是有用的,但在我的情况下,长时间运行的报告页面加载会破坏用户的多任务处理能力.

asp.net session queuing blocking

26
推荐指数
1
解决办法
6685
查看次数

iOS如何确定阻止UI的内容

我是iOS开发的新手,但我开始掌握一些更复杂的概念.我目前有一个实现AVCam捕获视频的应用程序.AVCam是在单独的线程上创建的,但使用的是我的主xib文件中的视图.当摄像头完成捕获时,它会在我的ViewController类中调用一个完整的函数.在完整的函数中,我调用了许多其他函数来更新UI以及一些NSLog.一切似乎工作正常,我立即在控制台中看到日志,但UI需要另外3秒钟来更新.我已经尝试使用工具来查找有问题的代码,但我似乎无法找到它.还有另一种方法可以确定UI阻塞的内容吗?

这是录制完成时调用的代码;

-(void)movieRecordingCompleted{
       [HUD hide:YES];
        NSLog(@"movieRecordingCompleted");
        [self showModalViewController];
        NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mov"];
        NSLog(@"pathToMovie: %@", pathToMovie);
        pathToTreatedVid = pathToMovie;
        NSLog(@"File Save Called");
        UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)

一切都被立即记录,但进度HUD和模态视图控制器不会触发大约2-5秒,这很奇怪.

这是线程的前后状态(当它被冻结时与它解冻时). 在此输入图像描述 在此输入图像描述

user-interface multithreading blocking ios

26
推荐指数
4
解决办法
2万
查看次数

UDP sendto()块什么时候阻止?

在UDP套接字上使用默认(阻塞)行为时,在这种情况下会调用sendto()块吗?我主要对Linux行为感兴趣.

对于TCP我明白,如果发送窗口已满,拥塞控制会使send()调用阻塞,但UDP呢?它有时会阻塞,还是让数据包在较低层被丢弃?

udp network-programming blocking

25
推荐指数
2
解决办法
2万
查看次数

Linux阻塞与非阻塞串行读取

我有这个代码用于从Linux中的Serial读取,但我不知道在读取串行端口时阻塞和非阻塞之间的区别是什么?在哪种情况下哪个更好?

linux serial-port nonblocking blocking termios

25
推荐指数
1
解决办法
4万
查看次数

Event Loop vs Multithread阻塞IO

我正在阅读有关服务器架构的评论.

http://news.ycombinator.com/item?id=520077

在这篇评论中,这个人说了三件事:

  1. 事件循环,一次又一次,已被证明真正为大量低活动连接发光.
  2. 相比之下,与事件循环相比,一次又一次地显示了具有线程或进程的阻塞IO模型,以减少基于每个请求的延迟.
  3. 在轻载系统上,差异无法区分.在负载下,大多数事件循环选择减速,大多数阻塞模型选择减少负载.

这些都是真的吗?

还有另一篇文章标题为"为什么事件是一个坏主意(对于高并发服务器)"

http://www.usenix.org/events/hotos03/tech/vonbehren.html

io events http blocking

23
推荐指数
1
解决办法
6768
查看次数

与传统I/O相比,Java NIO在阻塞模式下的优势是什么?

我几乎已经决定不使用异步,非阻塞的Java NIO.一般而言,复杂性与收益是非常值得怀疑的,我认为在这个项目中尤其不值得.

但是我读到的关于NIO的大部分内容,以及与旧版java.io.*的比较都集中在使用java.io.*的非阻塞,异步NIO与线程每连接同步I/O上.但是,NIO可以用于同步,阻塞,线程连接模式,这似乎很少讨论.

问题在于:同步阻塞NIO与传统同步阻塞I/O(java.io.*)是否有任何性能优势?两者都是线程连接.复杂性如何比较?

请注意,这是一个普遍的问题,但目前我主要关注TCP套接字通信.

java io performance nio blocking

23
推荐指数
3
解决办法
7420
查看次数

阻塞与同步,非阻塞和异步之间的区别是什么?

我正在阅读'使用Java操作系统概念'.我对阻塞和同步的概念很困惑,它们之间有什么区别?

io multithreading operating-system synchronous blocking

23
推荐指数
3
解决办法
2万
查看次数

非阻塞getch(),ncurses

我在使用ncurses的getch()来阻止时遇到了一些问题.默认操作似乎是非阻塞的(或者我错过了一些初始化)?我希望它像Windows中的getch()一样工作.我试过各种版本的

timeout(3000000);
nocbreak();
cbreak();
noraw();
etc...
Run Code Online (Sandbox Code Playgroud)

(不是所有的同时).WINDOW如果可能的话,我宁愿不(明确地)使用任何.一个while围绕残培环路(),检查特定的返回值是OK了.

linux g++ ncurses getch blocking

22
推荐指数
3
解决办法
5万
查看次数

BlockingCollection(T)性能

在我公司工作了一段时间,我们使用了一个自行开发的ObjectPool<T>实现,它提供对其内容的阻止访问.它非常简单:a Queue<T>,a ,object锁定,以及在AutoResetEvent添加项目时向"借用"线程发出信号.

该类的肉真的是这两种方法:

public T Borrow() {
    lock (_queueLock) {
        if (_queue.Count > 0)
            return _queue.Dequeue();
    }

    _objectAvailableEvent.WaitOne();

    return Borrow();
}

public void Return(T obj) {
    lock (_queueLock) {
        _queue.Enqueue(obj);
    }

    _objectAvailableEvent.Set();
}
Run Code Online (Sandbox Code Playgroud)

我们一直在使用这个和其他一些集合类而不是那些System.Collections.Concurrent因为我们使用的是.NET 3.5而不是4.0.但最近我们发现,由于我们使用无扩展,我们实际上Concurrent提供给我们的命名空间(在System.Threading.dll).

当然,我认为既然BlockingCollection<T>Concurrent命名空间中的核心类之一,它可能会提供比我或我的队友写的更好的性能.

所以我尝试编写一个非常简单的新实现:

public T Borrow() {
    return _blockingCollection.Take();
}

public void Return(T obj) {
    _blockingCollection.Add(obj);
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,根据一些简单的测试(从多个线程借用/返回池几千次),我们的原始实现在性能方面显着优势BlockingCollection<T>.他们似乎都工作正常 ; 只是我们原来的实现似乎要快得多.

我的问题: …

.net collections thread-safety blocking objectpool

22
推荐指数
2
解决办法
1万
查看次数