【问题标题】:Standard cpp data structures and pthread mutex?标准 cpp 数据结构和 pthread 互斥锁?
【发布时间】:2019-11-27 14:10:42
【问题描述】:

在其中一个项目中,我正在从 C 迁移到 C++。许多 C 代码使用与此库关联的 pthread 和 mutex 进行多线程处理。我想逐步执行增量迁移。我想从数据结构开始,因为它们是最明显的,但它们需要使用 pthread 互斥锁进行同步。使用 pthread 互斥锁是安全的还是只有标准库线程基础设施(如std::mutex)才能保证适当的内存线程间内存一致性?

【问题讨论】:

  • 使用 posix 线程并没有突然变得不安全,只是因为现在 C++ 也有线程和互斥体。您有没有想到可能有问题的特定情况?
  • 在 POSIX 平台上,很可能所有线程和同步类都是使用 pthread 实现的。
  • 您的 std::thread 和朋友的 C++ 实现有大约 100% 的可能性是 pthread 的薄包装。很可能会完全兼容。

标签: c++ pthreads


【解决方案1】:

C++ 中的线程库提供更高级别的抽象和其他有用的同步机制,如果您的编译器支持 C++11 或新的 C++ 标准功能,我认为您应该使用 C++11 线程库并在管理时体验 RAII 的美共享资源。

我对 pthreads 没有太多经验,但 pthread_mutexstd::mutex 具有相同的语义并回答您的问题

使用pthread mutex 是安全的还是只有标准库线程基础设施(如std::mutex)才能保证适当的内存线程间内存一致性

正如我在语义上提到的,它们是相同的,您可以轻松地在 pthread_mutex 之上构建一个可定位的抽象(具有 try_lockunlocklock 方法的类),这取决于您如何使用两者,例如

  • 是否导致数据争用
  • 如果您使用的是lock_guardunique_lock与否,因为如果你不使用RAII除了类似C中的资源管理问题, C++ 语句可以抛出异常,这将导致线程 如果互斥锁未解锁,则死锁。

除此之外,还有很多其他有用的东西,例如std::recursive_mutexstd::shared_mutexstd::futures、std::promises 等。

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多