【问题标题】:Protecting HW resources with many processes使用多个进程保护硬件资源
【发布时间】:2014-12-03 08:44:44
【问题描述】:

我创建了一个存在于用户空间中的 Linux 驱动程序。我创建了一个映射到一些自定义硬件寄存器的内存映射共享文件。

驱动程序将执行通常的读取-修改-写入操作,因此我需要某种锁来确保同步。

我正在制作的驱动程序可以被许多进程使用,当然还有线程,所以我想知道哪个是处理这个问题的最佳方法。

std::mutex 是否足以处理这种情况?我读到 std::mutex 不适用于多进程应用程序,这是真的吗?

我无法使用 Boost 库。

【问题讨论】:

  • 您需要使用跨线程和进程的平台特定原语。

标签: c++ multithreading memory-mapping


【解决方案1】:

您可以创建一个守护程序(一个普通程序),它实际上是 mmap() 并访问硬件寄存器,并启用某种接口与其他程序通信(例如 dbus,或您选择的任何 IPC 消息队列机制) .

这样,您不必担心多个线程或进程会同时访问同一个寄存器,从而避免竞争条件。

当然,在有人尝试访问您的硬件之前,该守护程序必须运行。类似于蓝牙的守护进程(man bluetoothd)。

【讨论】:

    【解决方案2】:

    假设您正在结合硬件运行定制软件,最简单的解决方案就是flock。更细粒度的方法是fcntl(F_SET_LK),但这是设计所破坏的(Linux 可能会在您关闭不相关的文件描述符时释放锁定!)。

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 2016-02-21
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      相关资源
      最近更新 更多