【问题标题】:multi-threading in a not thread-safe environnement非线程安全环境中的多线程
【发布时间】:2013-01-09 16:06:52
【问题描述】:

在我的 c++ 程序中,我使用了一个非线程安全的专有库 (.dll)。 :-(

在这个库中有一个特定的科学计算。

有没有办法安全地启动这个库的多个计算与线程并行? (1个进程,多线程)

我的程序“就像”一个“for”循环,每次计算我的非线程安全库时都会调用它

【问题讨论】:

  • 是的:自己同步所有内容。
  • 当今的大多数库都是线程安全的,因为您可以同时运行多个实例。例如:STL 的大多数实现。看看这个关于它的讨论sgi.com/tech/stl/thread_safety.html。但是,不看实际代码很难知道。
  • 通过设计避免死锁。
  • @scanpat:“自己同步所有内容”意味着有一个很大的旧互斥锁,您在使用该库时持有该互斥锁。当您要求“与线程并行计算该库的多个计算”时,这可能不是您真正想要的。任何时候只有一个线程会持有互斥锁,因此它并不是真正并行使用库。如果“库本身”是线程安全的,但其中有单独的类/结构是不安全的,那么您可以同步这些结构。但我假设“库不是线程安全的”是指它具有不安全的全局状态。
  • 同步将保证正确执行,但不会带来 OP 希望看到的任何并行性。

标签: c++ parallel-processing thread-safety


【解决方案1】:

听起来您想多次加载 DLL。看看Load the same dll multiple times

【讨论】:

  • 我自己没有这样做,但是如果您遵循“将 DLL 复制到临时文件”的建议,那应该不会太难。
  • 是的,这就是我所说的“不平凡”的意思。复制文件是……嗯。但不幸的是,没有其他办法,因为加载 DLL 两次只会增加引用计数。我想知道如果你只是创建一个联结是否有效,但......从技术上讲,一个不同的名字,它不需要复制任何东西。
【解决方案2】:

一个非常简单的方法是在您的for 循环中分叉多个从属进程。从进程加载非线程安全模块并进行计算,最后通过简单的返回码(如果结果适合 4 个字节)、IPC 或文件将结果返回给父进程。

当然,这种方法假定并行计算不需要与其他计算进行任何交互。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多