【问题标题】:Information Exchange between two threads by calling a shared DLL通过调用共享 DLL 在两个线程之间进行信息交换
【发布时间】:2011-02-06 23:02:48
【问题描述】:

如果这两个线程正在调用共享 DLL 库,您能否在两个线程之间创建“对话”(或信息交换)?而且,如果这种对话是可能的,那么它在线程之间实际发生的要求或限制是什么?

这个问题是我们的教授给我们的。根据问题的上下文,我只能假设我的教授指的是两个线程之间需要同步才能使对话成功,或者限制 DLL 链接类型(隐式或显式)。

再一次,假设与否,我在这里相当茫然:)

附: - 在这种情况下,我们使用 C 进行编程。

提前感谢您的帮助:)

【问题讨论】:

  • 我不敢相信这是您的实际问题。您是否以某种方式在某处弄错了单词?确切的词是什么。如果您的教授写了以上内容,那么我会让教授失败!
  • 嘿,戴夫,没有词错了,这就是问题...... 原样。

标签: c multithreading dll synchronization


【解决方案1】:

您的教授似乎正在测试您对加载 DLL 的空间以及这与线程的关系的理解。

在不为您做功课的情况下,我鼓励您考虑如果两个线程各自在特定 DLL 上调用 LoadLibrary() 会发生什么。 DLL 是否两次加载到进程中?

鉴于上述结果,这对于调用该 DLL 的两个线程有​​什么影响?

【讨论】:

  • 嘿,杰夫,我想我明白你要去哪里了。如果链接是隐式的,那么为线程调用的函数分配的内存应该是唯一的。如果链接是显式的,那么将创建两个不同的函数(但相同),因此不允许“对话”发生。我希望我做对了....再次感谢:)
  • 我认为您仍然需要回答我原来的问题,再加上另一个问题:1)“考虑如果两个线程都在特定 DLL 上调用 LoadLibrary() 会发生什么。DLL 是否两次加载到进程中? " 2) 隐式和显式 DLL 链接实际上对 DLL 在内存中的放置位置或它的初始化方式有任何影响吗?
【解决方案2】:

您是否考虑过使用 Boost.Interprocess,因为 C++ 有许多隐式分配。通常,您需要一个系统范围的互斥锁来同步对那部分内存的访问。

【讨论】:

  • 如果线程在同一个进程中,则互斥锁不需要在系统范围内。
【解决方案3】:

我认为给每个线程调用 LoadLibrary() 系统将为每个 DLL 分配不同的内存段,因此每个线程将没有共同的资源来使用,因此它们将无法交换任何信息。

但是... 假设我们将使用 #Pragam Comment(lib, "myDLL.lib") 显式链接到 DLL 我认为通过这种方式,您将能够在线程之间共享资源,因为 DLL 在程序启动时已完全加载。

杰夫? ..这是对的吗?...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多