我有三个课程,我们称之为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()中执行锁定以获得更多封装。这仍然是线程安全的吗?
答案 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
在请求硬件访问之前,在B
和hd.accessHardware()
方法中锁定互斥锁。
这会产生在调用hd.accessHardware()
之前忘记锁定该互斥锁的风险。
现在我想知道是否可以在
hd.accessHardware()
中执行锁定以获得更多封装。这仍然是线程安全的吗?
这消除了忘记锁定该互斥锁并使您的API更难被滥用的风险。这仍然是线程安全的。