1

我有一个关于多线程的概念性问题:

在通过 DCOM 使用 RPC 的应用程序中,具有多线程公寓配置,主要形式是冻结。

1 - 如果在单元初始化中创建了CriticalSession,那么关键会话中的代码会在主线程上下文中运行吗?

2 - 当您调用方法执行任务时:
创建线程 1。(DCOM 线程)
线程 1 创建线程 2。
线程 1 WaitFor 线程 2。
线程 2 创建 4 个线程以更快地运行任务。
线程 2 循环休眠 2 秒,直到 4 个线程结束。在这个过程中,主窗体应该被刷新以显示完成的百分比。一条消息以完成百分比发布到主窗体线程,但没有任何反应,主窗体被冻结。

3 - 当需要在线程 2 中进行 CRUD(创建读取更新删除)对象时,有一种更好的方法代替 synchronized() 方法,可以在 4 个线程之一同步?

4 - 4个线程的优先级高于主线程这是一个问题吗?当这成为一个问题?

下图代表了系统的架构:

系统架构

4

1 回答 1

4

1:不。通过使用关键部分,您可以保证代码一次只在一个线程中运行;实际上,任何调用 Enter 的线程都会在那里,直到任何其他也在运行该代码的线程到达 Leave 调用。但这并不意味着它将在主线程中运行(检查 GetCurrentThreadID)

2:你提到了单元配置,但是哪个单元线程模型?这定义了 (D)COM 何时为您进行线程同步。在实践中,COM 将使用代理存根并在幕后编组以遍历单元(和网络)边界,除非您选择了多线程单元,在这种情况下,COM 将假设组件自己处理线程问题。

如果我理解正确,主窗体会冻结在“线程 1 WaitFor 线程 2”上。与其调用 WaitFor,不如在 Thread2 上使用 OnTerminate 事件。

3:我不确定“线程 2 中的 CRUD 对象”是什么意思。如果知道 4 个线程以什么顺序完成并不重要,我建议按顺序在线程上调用 WaitFor。如果是,您应该查看WaitForMultipleObjects

4:不同的优先级应该不是问题。只有当有太多的高优先级线程在做太多的工作时才会出现问题,因此进行内部通信的普通优先级线程无法跟上,但在这种情况下,您应该查看工作线程如何报告它们的工作。

于 2013-03-11T15:40:12.587 回答