【问题标题】:Multithreading library that can share pointer data safely?可以安全共享指针数据的多线程库?
【发布时间】:2013-04-20 11:26:04
【问题描述】:

基本上我想要实现的是在不同线程之间共享一个动态分配的状态标志数组,以控制线程之间的交互。

是否有任何库可以在 Windows 操作系统中完美实现这一目标?

我尝试了 Open MP,它给了我各种奇怪的错误和很多令人头疼的问题,即使使用 omp flush all 有时数据仍然不是最新的,当访问频率很高时,易失性指针也没有帮助,所以程序变得非常不稳定和不一致。

是否有任何库可以更好地处理共享和频繁更新和访问的数据数组(动态)? TBB可以处理这种情况吗?

【问题讨论】:

  • C++ 标准库。您可以在构造时将共享数据传递给线程对象。
  • 在进程的线程之间共享数据?!您不需要任何外部库。传递对象、变量、指针等数据...

标签: c++ c windows multithreading


【解决方案1】:

同一进程的线程共享同一个堆,因此分配在该堆上的内存可以在这些线程之间共享。

所有程序需要确保保护这种“共享”内存免受并发访问。

后者可以通过使用锁来实现,比如互斥锁。

【讨论】:

  • 我认为问题在于编译器试图将其中一些共享数据加载到寄存器中,并且出于某种奇怪的原因,即使使用 volatile 有时它仍然无法确保线程之间数据的一致性。
  • @user2188453:volatile 在这里无济于事(阅读此处:software.intel.com/en-us/blogs/2007/11/30/… 了解更多信息)。通过锁保护并发访问。
  • 我试过 omp critical 和 omp atomic,它们本质上不是锁吗?
  • @user2188453:使用 win32 API 和 Windows 线程时,EnterCriticalSection()LeaveCritialSection() 周围的函数可能会有所帮助。更多关于 win32 API 的同步功能可以在这里找到:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 感谢您的链接,我将尝试使用 win32 API,顺便说一句,我认为仍然需要 volatile,否则编译器可以简单地将一些共享数据加载到寄存器中或执行其他代码“优化”,然后即使是缓存一致性也无济于事。
【解决方案2】:

常见的解决方案是使用互斥锁。基本思想是用临界区包装对共享变量的任何访问,即。互斥锁:

 WaitForSingleObject(mutexHandle);
 // shared data access & modification
ReleaseMutex(mutexHandle);

如果您可以访问 C++11,请尝试使用 std::atomic<T> 类型,它可以让您共享具有原子访问语义的原始类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 2012-08-19
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多