【问题标题】:Mutex in C++ BEFORE C++11C++ 11 之前的 C++ 中的互斥锁
【发布时间】:2017-01-26 10:09:07
【问题描述】:

问题很简单——对于 C++11 之前的 C++ 中的互斥体,什么是简单、现成的解决方案?我不需要任何花哨的东西 - 只需要一些代码来等待另一个回调(可能随时发生)在执行之前完成。

我在您日常使用的 PC、i7 等设备上运行。没有特定的性能要求(只是不会太慢),但必须完成停止一个进程并让另一个进程完成然后恢复第一个进程的工作。

提前致谢!

【问题讨论】:

  • 你必须使用一些操作系统特定的功能,比如 pthreads,或者试试boost.mutex。
  • 您针对什么目标系统和处理器提出这个问题? 请编辑您的问题以改进它并激发它。
  • 无论您使用什么 API 来启动多个线程,都应该有自己的互斥锁实现可用。
  • 我不是创建线程的人(我只是提供一个包含一些关键部分的线程安全库)但是是的,我可以问谁会整合我的东西告诉我他们是什么重新用于他们这边的多线程。
  • 一台日常 PC 运行在 一些 操作系统(通常是 Windows,但可能是 Linux、FreeBSD 甚至 FreeDOS)下。那个特定的操作系统对你的问题很重要。如果不提及您的操作系统,问题就不清楚

标签: c++ mutex c++03


【解决方案1】:

Boost Synchronization 肯定是一个有效的选项。

如果您不想使用 Boost(根据您的问题,您可能会发现它对您的需求来说太过分了),您可以围绕目标平台提供的 API 编写自己的 c++ 类包装器(即 POSIX 的 POSIX thread mutex兼容的平台,或在 Microsoft Windows 操作系统上为 Windows Mutexes 或 Critical Sections)。

其他人肯定已经实现了很多这样的包装类,即您可以尝试使用 mutex 关键字在 GitHub 上搜索并限制代码和 C++ 语言的结果 (here are a lot of results)。

【讨论】:

    【解决方案2】:

    在 posix(大多数 Unices)系统上使用 pthread。在 Windows 上,您最好的选择是关键部分。

    【讨论】:

    • 更多信息:在Win32 API中,“mutex”是进程间同步,“critical section”是线程间(但不会到达当前进程之外)
    【解决方案3】:

    您不仅可以查看 Boost,还可以查看 POCO(它的 Mutex 类)或 Qt(它的 QMutex 类)。

    如果您只针对 POSIX pthreads,在其标准 mutexes 之上编写自己的互斥锁类是可行的,并且已经完成了很多次。

    然而,切换到 C++11 可能是 2017 年最好的方法。请注意,最近 GCC 或 Clang/LLVM 支持许多(嵌入式,或平板电脑/笔记本电脑/台式机/服务器) 处理器。

    (因此可能值得付出努力或金钱来以某种方式获得最新的 GCC 或 Clang,也许可以通过从源代码编译这些编译器,或者花钱请人来完成这项工作)

    您应该说明您的目标计算机(处理器、操作系统(如果有)、可用内存)。即使 POCO 或 Qt 或 Boost 可以在 C++03 模式下编译,它们也可能不适合微型嵌入式处理器(例如一些 Arduino)。

    【讨论】:

    • 即使在 2017 年,仍然有平台(即嵌入式),不幸的是可能没有 C++11 兼容的编译器。无论如何,尽可能切换到(至少)C++11 肯定是最好的方法。
    • 但是 recent GCC 和/或 Clang/LLVM 可以针对很多处理器(包括嵌入式世界),但当然不是全部。顺便说一句,在那些今天没有任何可能的 C++11 的平台上,我猜想没有任何建议的解决方案(Boost、POCO、Qt)可以轻松工作。
    • 当然可以,但“很多”并不意味着“全部”;-)
    • Poco 明确支持 C++03 编译器(或从 1.6 开始支持)
    • 是的,但我想它可能太大而无法实际在小型奇怪的嵌入式系统(类似Arduino)上编译。我的观点是,OP 应该为他的问题提供更多背景信息。
    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 2013-07-25
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多