c++ - 使用二进制信号量创建互斥锁

标签 c++ multithreading embedded

我正在使用一个简单的系统,它没有互斥锁,而是一组有限的硬件二进制信号量。通常,所有多线程都是使用繁重的信号量技术完成的,这使得代码的性能很差,而且很难在没有死锁的情况下正确编写。

一种天真的实现是全局使用一个信号量以确保对临界区的原子访问。但是,这意味着如果正在访问任何关键部分,不相关的对象(即使是不同类型的对象)将被阻塞。

我目前对这个问题的解决方案是使用单个全局信号量来确保对保护字节的原子访问,然后确保对特定临界区的原子访问。到目前为止我有这个:

while (true) {
    while (mutexLock == Mutex::Locked) {
    } //wait on mutex
    Semaphore semaLock(SemaphoreIndex::Mutex); //RAII semaphore object
    if (mutexLock == Mutex::Unlocked) {
        mutexLock = Mutex::Locked;
        break;
    }
} //Semaphore is released by destructor here
// ... atomically safe code
mutexLock = Mutex::Unlocked;

我有几个问题:这是解决这个问题的最佳方法吗?这段代码是线程安全的吗?这与“双重检查锁”相同吗?如果是这样,它是否会遇到同样的问题并因此需要内存屏障?

编辑:关于正在实现的系统的一些注意事项......

它是一个具有 32kB RAM 的 RISC 16 位处理器。虽然它具有强大的多线程功能,但它的内存模型非常原始。加载和存储是原子的,没有缓存,没有分支预测或分支目标预测,一核多线程。内存屏障主要是为了让编译器知道它应该将内存重新加载到通用寄存器中,而不是出于任何硬件原因(无缓存)

最佳答案

即使处理器具有很强的多线程能力(顺便说一句,不确定你的意思。),但它是一个单核处理器,这仍然意味着在任何时候只能执行一个线程。

必须采用任务切换系统(通常在特权模式下运行)使用该系统,您必须能够定义临界区以原子地执行(软件实现的)互斥锁定/解锁。

当您说“一个内核,多个线程”时,是否意味着您的处理器上运行着某种内核?任务切换系统将由该内核实现。 查看您的内核文档或向您的供应商寻求任何提示可能会有所帮助。

祝你好运。

关于c++ - 使用二进制信号量创建互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19189552/

相关文章:

c++ - 使用 openCV VC++ 读取文件 I/O

java - 如何处理 Java Applet 中的多个按键?

c - 调用 fclose() 后,该文件多快可用于另一个线程?

c - 在虚拟机中实现切换到新线程的上下文

Cortex-M4 中的 SysTick 异常能否抢占自身?

c - 以编程方式模拟函数

php 与正在运行的 c++ 交互

c++ - 将值 append 到嵌套的 QList

c - 如何消除结构中未使用的元素?

c++ - 在 Windows 7 上用 C++ 格式化硬盘