Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用一个新的同步工具来实现互斥锁,该工具将阻止线程,直到它';s值大于给定界限?_C++_Synchronization_Mutex_Thread Synchronization - Fatal编程技术网

C++ 如何使用一个新的同步工具来实现互斥锁,该工具将阻止线程,直到它';s值大于给定界限?

C++ 如何使用一个新的同步工具来实现互斥锁,该工具将阻止线程,直到它';s值大于给定界限?,c++,synchronization,mutex,thread-synchronization,C++,Synchronization,Mutex,Thread Synchronization,我正在学习同步,我发现这个主题是迄今为止我在编码中遇到的最难的事情!我真的需要帮助,也许我会开始理解这个主题! 我学习了带简单锁定和解锁的互斥锁,我学习了条件变量和(使用信号和等待)我也解译了信号量,但当我遇到一个问题时,它给了我一个新的“同步”工具,并要求我用它实现另一个互斥锁工具,我只是不知道从哪里开始 例如,假设我有这个新的同步工具,我被要求使用它实现一个简单的互斥锁,如何开始解决这样的问题?这就是问题所在!我丢了一些小费?(请不要结束这个问题,我真的需要一些提示,我没有希望了) 如果您有

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

例如,假设我有这个新的同步工具,我被要求使用它实现一个简单的互斥锁,如何开始解决这样的问题?这就是问题所在!我丢了一些小费?(请不要结束这个问题,我真的需要一些提示,我没有希望了)


如果您有一个信号量,那么实现互斥是微不足道的,因为它基本上是一个大小为1的符号


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

C#?看起来更C++对我…这是错误的,我将删除标签SyryHOHH我开始理解!好吧,如果第一个线程叫做H(H,-5,-10),例如?然后该线程将插入,然后值将为-10,现在其他线程无法输入,直到在ulock中第一个线程调用H(H,-20,10),然后值(-10>-20),现在值为零,所以其他线程可以输入,但这有什么意义呢?为什么不只使用0和-1和1,为什么我们可以选择使用其他数字?它不会添加任何内容,对吗?@anna没错!好的,当你有一个信号量时,你的想法是你可以增加/减少数字以允许在关键部分有多个线程。但在实现互斥时,只需要0/1/-1。这个练习的目的是让你意识到你可以用信号量实现互斥(这是最简单的练习)。
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;
}
typedef struct mutex {
newSem h;
} mutex;
void mutex_init(mutex* m) {
//TODO
}
void mutex_lock(mutex* m) {
//TODO
}
void mutex_unlock(mutex* m) {
//TODO
}