Mutex使用pthreads作为类成员

时间:2017-05-26 10:30:42

标签: c++ linux multithreading pthreads mutex

我有三个课程,我们称之为A,B和HardwareDriver。每个类都有一个实例。 a和b在两个不同的线程中运行。它们都通过HardwareDriver实例访问硬件。类似的东西:

$(".col-md-3").toggle(
  function(){
    $(this).animate({ left: "-5px", top:"-5px" }, 100);
  },
  function(){
    $(this).animate({ left: "5px", top:"5px" }, 100);
  }
);

a和b无法同时访问硬件,因此我需要使用互斥锁保护代码。我是多线程的新手,但直觉上我会在通过调用方法hd.accessHardware()来请求硬件访问之前锁定A和B方法中的互斥锁。

现在我想知道是否有可能在hd.accessHardware()中执行锁定以获得更多封装。这仍然是线程安全的吗?

3 个答案:

答案 0 :(得分:1)

是的,您可以在HardwareDriver类中使用互斥锁,并在类方法中包含一个关键部分。它仍然是安全的。请记住,如果您复制对象,您还将拥有互斥锁的副本。

答案 1 :(得分:0)

在C / C ++中进行多线程编程时,应确保在执行任何 READ WRITING 的任何线程访问的数据都被锁定> WRITE 操作,您可以保留lockfree READONLY 数据。

锁定操作必须具有较小的范围可能,如果TWO对象访问单个资源,则需要 SINGLE 信号量/互斥量,使用两个将使您暴露于危险的deadlocks

因此,在您的示例中,您应该在 HardwareDriver 类中添加一个互斥锁,并在每次读/写任何类数据时锁定/解锁它。

您不需要锁定本地数据(堆栈分配的局部变量),也不需要锁定reentrant方法。

由于您正在编写C ++并且我们在2017年,我想您可以使用,并建议您使用 std :: thread std :: mutex 而不是pthread直接。在Linux中,C ++本机线程支持是pthreads的一个小包装,因此在嵌入式目标中使用它们的开销也是微不足道的。

答案 2 :(得分:0)

  

我会通过调用方法A在请求硬件访问之前,在Bhd.accessHardware()方法中锁定互斥锁。

这会产生在调用hd.accessHardware()之前忘记锁定该互斥锁的风险。

  

现在我想知道是否可以在hd.accessHardware()中执行锁定以获得更多封装。这仍然是线程安全的吗?

这消除了忘记锁定该互斥锁并使您的API更难被滥用的风险。这仍然是线程安全的。