问题标签 [blocking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1682 浏览

php - 在不阻塞的情况下查询 PHP 信号量?

是否可以在不像 sem_acquire 函数那样实际阻塞的情况下查询使用 sem_get 创建的信号量?

干杯,丹。

0 投票
2 回答
1705 浏览

vb.net - 为什么会阻塞?(带有事件和委托的 VB.NET 多线程)

我有一个功能,即 dll 中的一个类显示一个表单,要求用户在单击按钮说“重试”之前清除打印机上的故障。用户一直在重试而没有清除故障,所以我现在正在编写一个互锁代码:调用表单上的按钮被禁用,直到调用表单上的“启用”方法。

这是通过委托调用完成的,因为触发这些更改的事件来自在不同线程上运行的其他 dll。

表单的“启用”方法被连接到事件处理程序中,用于处理来自不同线程(监控以太网 IO 服务器的线程)的事件。

我遇到的问题是“_Fault_StateChanged”事件永远不会触发。我怀疑原因是我在这里使用的“ShowDialog”和“DialogResult”技术,但我在此应用程序的其他地方使用了完全相同的技术。

任何建议都会很棒

请参阅下面的代码摘录:

主要课程摘录

重试表单类摘录

回应丹尼尔评论的更多细节

这里的代码不完整,只是摘录。故障对象是对外部库的订阅,并且是以太网 IO 服务器的处理程序。_fault StateChanged 事件在 IOServer 上的数字输入发生更改时触发。我知道以下内容:我的跟踪文件显示信号变高,这会调用重试表单。当重试屏幕仍然显示时,信号物理上再次变低。...但事件没有触发

就好像应用程序在 ShowDialog/DialogResult 完成之前无法为传入的事件提供服务 - 但我对此感到困惑,因为我知道 .NET 2.0 中的 ShowDialog 没有阻塞,我应该仍然能够为事件提供服务,并且已经使用在应用程序的其他地方使用相同的模式。

需要注意的几点: MAIN CLASS 在运行时通过基于配置的反射动态实例化。这是VS2005 SP2

如果这有帮助,我会将整个课程发布在另一个代码框中,但它可能会挤满现场......

谢谢安迪

0 投票
2 回答
1791 浏览

python - 多线程 python 应用程序在运行其线程时挂起

我正在尝试创建一个可用作 DBus 服务的 MainObject。此 MainObject 应始终保持对其他对象/进程的响应,并且即使在处理其项目时也应保持这种非阻塞状态。因此,项目在一个单独的线程中一个接一个地处理(队列样式)。您可以通过 DBus 或 CommandLine 将项目添加到 MainObject。我简化了示例(没有 dbus,没有命令行)来显示我的问题。

我的问题是,如果我重新启用“tt.join()”,应用程序按预期工作,但它会阻塞其他进程。难怪, tt.join 使应用程序等到单独的线程完成其工作。另一方面,如果 'tt.join()' 保持禁用状态,应用程序不会阻止外部 dbus 事件,但永远不会出现 'ThreadTest done!' (看实际输出)

我想要的是,我的预期输出,但应用程序应该保持响应。

预期输出:

实际输出:

0 投票
4 回答
219 浏览

java - 高效阻塞查询的建议

我想将元组对象存储在并发的 java 集合中,然后有一个高效的阻塞查询方法,它返回与模式匹配的第一个元素。如果没有这样的元素可用,它将阻塞,直到出现这样的元素。

例如,如果我有一堂课:

还有一个像这样的集合:

我想像这样查询它:

它返回字段等于“foo”或块的第一个可用对,second直到添加这样的元素。另一个查询示例:

应该返回第一个可用的对,无论其值如何。

解决方案是否已经存在?如果不是这种情况,您建议如何实施该get( Pair p )方法?

澄清:该方法get( Pair p)还必须删除元素。名字的选择不是很聪明。一个更好的名字将是take( ... )

0 投票
4 回答
19929 浏览

c - 使用 select 读取和写入同一个套接字 (TCP)

我们正在编写一个客户端和一个服务器来执行(我认为是)非常简单的网络通信。多个客户端连接到服务器,然后服务器应该将数据发送回所有其他客户端。

服务器只是处于阻塞select循环中等待流量,当流量到来时,将数据发送给其他客户端。这似乎工作得很好。

问题是客户端。为了响应读取,它有时会想要进行写入。

但是,我发现如果我使用:

我的代码将阻塞,直到有新数据要读取。但有时(从另一个线程异步)我会有新数据要写入网络通信线程。所以,我希望我的选择定期唤醒并让我检查是否有数据要写入,例如:

我尝试将选择设置为轮询模式(或非常短的超时):

但发现然后客户端永远不会收到任何传入数据。

我还尝试将套接字 fd 设置为非阻塞,例如:

但这并不能解决问题:

  1. 如果我的客户select()没有struct timeval,则读取数据有效,但它永远不会解除阻止让我查找可写数据。
  2. 如果我的客户select()有一个timeval让它轮询,那么它永远不会发出有要读取的传入数据的信号,并且我的应用程序冻结认为没有建立网络连接(尽管所有其他函数调用都已成功)

关于我可能做错了什么的任何指示?是否不可能在同一个套接字上进行读写(我不敢相信这是真的)。

(编辑:正确的答案,以及我在服务器上而不是在客户端上记得的事情,是有第二个 fd_set,并在每次调用 select() 之前复制 master_list:

)

0 投票
4 回答
574 浏览

c++ - 如何从被阻止的呼叫中返回?

是否可以强制线程从对阻塞函数的调用返回,例如从流中阻塞读取?

例如...

0 投票
6 回答
12807 浏览

java - 垃圾收集和线程

AFAIK 当 GC 正在做它的事情时,VM 会阻塞所有正在运行的线程——或者至少在它压缩堆时。在 CLR 和 JVM (2010 年 1 月的生产版本)的现代实现中是这种情况吗?请不要提供有关 GC 的基本链接,因为我了解基本的工作原理。

我假设全局锁定是这种情况,因为当压缩发生时,引用可能在移动期间无效,并且似乎最简单的方法只是锁定整个堆(即通过阻塞所有线程间接地)。我可以想象更强大的机制,但 KISS 经常占上风。

如果我不正确,我的问题将通过对用于最小化阻塞的策略的简单解释来回答。如果我的假设是正确的,请对以下两个问题提供一些见解:

  1. 如果这确实是这种行为,那么像 JBOSS 和 Glassfish 这样的重量级企业引擎如何保持始终如一的高 TPS 率?我在 JBOSS 上进行了一些谷歌搜索,我期待在 APACHE 上找到一些适合 Web 处理的内存分配器。

  2. 面对 NUMA 式的架构(可能在不久的将来),这听起来像是一场灾难,除非进程是受线程和内存分配限制的 CPU。

0 投票
3 回答
2616 浏览

winforms - 最佳实践:在等待 Async 方法时阻塞执行

我正在尝试调整现有程序(内部编写)以使用与最初不同的库。我已经抽象出大部分特定于库的代码(似乎是更容易的部分)。

问题是,旧库将使用阻塞方法执行调用,而我们的内部程序期望调用阻塞方法,但新库使用异步方法。

我想知道等待异步操作完成的最佳做法是什么。我的第一个想法是有一个名为完成的布尔标志,并在 while 循环中旋转,直到完成 == true。

我应该注意,这是为了快速证明我试图为我的利益相关者整理的概念,如果利益相关者签署该项目,我将重写我们程序的违规部分。但是暂时我只需要等待阻塞调用异步方法的函数,直到异步调用完成

0 投票
5 回答
1850 浏览

php - 是否可以阻止上传文件夹中的 php 脚本?

我在 php 中体验了我的第一个表单,可以上传图像。

我在网上看到一些文章解释它可能很危险,所以有什么方法可以阻止指定文件夹上的脚本?有.htaccess或 php.ini指令的东西?

0 投票
2 回答
3274 浏览

c++ - 如何中止winsock阻塞调用?

我在 C++ 中使用 Winsock 2,想知道如何让我的服务器停止从客户端连接读取。阅读线程被阻塞recv(),我不知道如何中止它。一种方法是使用带有 的非阻塞套接字select(),但该线程必须等待才能检查新的select().

停止读取套接字的正确方法是什么?