所有事件驱动框架都应该是单线程的吗?

2023-11-27

http://weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html认为多线程 GUI 框架是一个失败的梦想。非 GUI 框架怎么样?这个经验法则是否适用于所有事件驱动框架?

这是引起我注意的文章中的一句话:

输入事件处理的问题在于它往往以与大多数 GUI 活动相反的方向运行。一般来说,GUI 操作从库抽象堆栈的顶部开始,然后“向下”进行。我在我的应用程序中操作一个由一些 GUI 对象表达的抽象概念,因此我在我的应用程序中开始并调用高级 GUI 抽象,这些抽象调用了较低级别的 GUI 抽象,这些抽象调用了丑陋的内部结构。工具包,然后进入操作系统。相比之下,输入事件从操作系统层开始,并逐渐“向上”分派到抽象层,直到它们到达我的应用程序代码。

现在,由于我们正在使用抽象,我们自然会在每个抽象中单独进行锁定。不幸的是,我们遇到了经典的锁排序噩梦:我们有两种不同类型的活动正在进行,它们想要以相反的顺序获取锁。所以僵局几乎是不可避免的。


不。即使作为经验法则,它也只是说“很难让它们发挥作用”。但事件驱动框架非常类似于事件驱动模拟和其他各种东西;事实上,Java 世界中的困难并不是因为多线程,而是因为 Java 中可用的抽象。

在另一个环境中,比如 Erlang,它既相当自然,又非常健壮。

Update

听起来他的抽象概念仍然是错误的。我没有看到该问题中存在任何强制锁定问题的固有问题。我认为关键在这里:

现在,由于我们正在使用抽象, 我们自然会进行锁定 在每个抽象中分别进行。 不幸的是我们有经典 锁排序噩梦:我们有两个 正在进行不同类型的活动 想要获取相反的锁 命令。所以僵局差不多了 不可避免的。

那么为什么僵局几乎不可避免呢?因为正在发生两种不同类型的活动,它们想要以相反的顺序获取锁。这是因为“我们自然会在每个抽象中单独进行锁定”。

换句话说,他选择了——或者环境为他选择了——不支持他的需求的抽象。他似乎声称,因此不存在这样的抽象。我觉得这没有说服力。我首先要检查两件事:

  • "自然我们将在抽象中单独进行锁定”,并且
  • “我们正在发生一些事件,希望以相反的顺序获取锁。”

根据我的经验,“自然 X”通常意味着“我还没有真正寻找其他选择”。我非常怀疑事件想要以相反的顺序获取锁;你获得了一个锁,你做了一些事情,然后你释放了它。

关键是,他似乎在陈述这样一个事实:他发现很难想出一个计划来does作为一个定理来说明没有方案can work.

如果没有关于问题的更多细节,就很难构造一个反例,但正如我上面所说,有很多系统示例,这些系统的事件以各种方式异步地从内部进程和 GUI 进行,这些系统管理有许多并发控制线程并且不会死锁。我想到了 Erlang,因为这些问题中的一类——电话——是 Erlang 的发明对象,事实上,这些问题是whyErlang 被发明了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

所有事件驱动框架都应该是单线程的吗? 的相关文章

  • 这是依赖注入吗?这是一种不好的做法吗?

    我有一个小框架 我是这样编码的 我不确定这是否称为依赖注入 我不知道它是否像设计模式 我也不知道并且想知道是否通过 this因为 param 是一种不好的做法 看看这个 不是一个有效的示例 只是将这些代码写入浏览器中以供解释 This is
  • 如何限制Erlang VM(BEAM)使用的核心数量?

    我正在具有 2 个四核 Xeon E5520 2 2GHz 24 0GB RAM 和 Erlang R15B02 启用 SMP 的节点上运行实验 我想知道是否可以限制Erlang VM使用的核心数量 以便我可以暂时禁用一些核心并逐步增加数量
  • 如何使用 runOnUiThread 而不出现“无法对非静态方法进行静态引用”编译器错误

    我有一个主课 ClientPlayer extends Activity 和一项服务 LotteryServer extends Service implements Runnable 当尝试在此服务的 run 方法中使用 RunOnUiT
  • 除非在后台线程中获取新的引用,否则存在潜在的引用计数问题

    我有一个second https stackoverflow com questions 28898966 prefer property accessor or kvc style for accessing core data prop
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 从父类调用重写的虚拟方法

    假设您正在编写原始 C Object类并且您想要以下功能 object1 object2将比较引用 除非该运算符被覆盖 object1 object2将始终返回对象实际值的倒数object1 object2 所以 举例来说 如果我有一个Bu
  • 调试 Java InterruptedException,即查找原因

    在调试Android应用程序时 有时中断异常发生并使应用程序崩溃 我已经能够在默认异常处理程序上设置断点 但调用堆栈不提供信息 at java util concurrent locks AbstractQueuedSynchronizer
  • R参考类问题

    我正在尝试在 R 中创建一个简单的参考类 这是我的代码 R 初学者 MyClass lt setRefClass MyClass fields list a numeric b numeric methods list initialize
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • 异步回调在哪个线程上运行?

    我正在做几个HttpWebRequest BeginGetResponse调用 并在回调方法中BeginGetResponse 我正在调用一个事件处理程序 在EventHandler中 有测试下载是否成功的逻辑 如果没有 它会尝试重新下载
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • VB - 以隐式方式链接 DLL

    我正在开发 VB6 图形界面 并且需要隐式链接到 DLL 这样做的动机来自于我上一个问题 https stackoverflow com questions 5194573 有问题的 DLL 使用静态 TLS declspec thread
  • 父子进程之间的通信

    我正在尝试创建一个具有一个或多个子进程的 Python 3 程序 父进程生成子进程 然后继续处理自己的业务 有时我想向特定的子进程发送一条消息 由其捕获该消息并采取行动 此外 子进程在等待消息时需要处于非锁定状态 它将运行自己的循环来维护服
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 什么是对象序列化和反序列化?

    什么是对象序列化 and 反序列化 序列化与读取对象的属性 然后用它们填充 DataRow 的列 最后将 DataRow 保存在数据库中等普通技术有什么区别 序列化通常是指创建可用于存储 可能在文件中 通过网络传输或仅用于进程之间传输的数据
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g

随机推荐