如何使用新的同步工具实现互斥锁,该工具会阻塞线程直到它的值大于给定界限?

how to implement a mutex using a new synchronization tool that blocks the thread until it's value is larger than a giving bound?

我正在研究同步,我发现这个主题是我迄今为止在编码中遇到的最难的事情!我真的需要帮助,也许我会开始理解这个主题! 我通过简单的锁定和解锁了解了互斥锁,我了解了条件变量和(使用信号和等待)我也了解了信号量,但是当我遇到一个问题时,它给了我一个新的“同步”工具并要求我用它实现另一个互斥工具我只是不知道从哪里开始。

例如,假设我有这个新的同步工具,我被要求使用它来实现一个简单的互斥体,如何开始解决这样的事情?这就是字面上的问题!我失去了任何提示? (请不要关闭问题我真的需要一些提示我很绝望)

typedef struct newSem{
    int value;
} newSem;
// Initialize the newSemto value 0.
void newSem(newSem* h) {
   h->value = 0;
}
// Block until the newSem has value >= bound, then atomically increment its value by delta.
void H(newSem* h, int bound, int delta) {
// This is pseudocode; a real newSem implementation would block, not
// spin, and would ensure that the test and the increment happen in one
// atomic step.
     while (h->value < bound) {
         sched_yield();
     }
     h->value += delta;
}

例如在 newSem 中实现这个:

typedef struct mutex {
newSem h;
} mutex;
void mutex_init(mutex* m) {
//TODO
}
void mutex_lock(mutex* m) {
//TODO
}
void mutex_unlock(mutex* m) {
//TODO
}
 

如果你有一个信号量,那么实现互斥量就很简单了,因为它基本上是一个大小为 1 的信号量。

假设您已将信号量初始化为 0,如问题中所示。然后如果你用两个线程调用H(h, 0, -1),第一个到达的线程会立即进入并将值设置为-1。另一个线程将不得不等待,因为 -1 < 0。然后第一个线程调用 H(h, -1, 1) 退出并将值放回 0,因此第二个线程现在可以进入。