C++ 信号量与条件变量-抽象级别

C++ 信号量与条件变量-抽象级别,c++,multithreading,c++11,synchronization,C++,Multithreading,C++11,Synchronization,当我在C++11中搜索如何使用信号量时,我看到人们经常建议我使用std::mutex和std::condition\u变量(例如)。这使我认为信号量是比互斥量和条件变量更高级的抽象 然而,在我学习了我们的操作系统类之后,我现在知道在内核中,信号量通常是最低级别的抽象。信号量是通过禁用中断来实现的,锁本质上是值为1的信号量,而条件变量是从头开始实现的,不使用信号量或锁。因此,信号量(在内核级别)似乎并不是比锁或条件变量更高级的抽象 所以我的问题是,我的结论是“信号量(在C++11中)是更高级别的抽

当我在C++11中搜索如何使用信号量时,我看到人们经常建议我使用
std::mutex
std::condition\u变量(例如)。这使我认为信号量是比互斥量和条件变量更高级的抽象

然而,在我学习了我们的操作系统类之后,我现在知道在内核中,信号量通常是最低级别的抽象。信号量是通过禁用中断来实现的,锁本质上是值为1的信号量,而条件变量是从头开始实现的,不使用信号量或锁。因此,信号量(在内核级别)似乎并不是比锁或条件变量更高级的抽象


所以我的问题是,我的结论是“信号量(在C++11中)是更高级别的抽象”只是标准库限制的产物吗?或者它是用户级和内核级同步之间差异的结果?

它是用户级和内核级同步之间差异的结果

当您在内核中声明时,您不会声明所引用的内核。对于内核,标准库必须尽可能不可知,因此选择最常见的接口。并非所有内核都以完全相同的方式实现锁

例如,Linux内核中锁的实现比初始化为值1的基本信号量要微妙得多。也许你听说过


最后,由于与互斥量相比,信号量的使用非常少,因此选择互斥量作为标准库的公共接口是有意义的。

这是用户级和内核级同步之间的差异造成的

当您在内核中声明时,您不会声明所引用的内核。对于内核,标准库必须尽可能不可知,因此选择最常见的接口。并非所有内核都以完全相同的方式实现锁

例如,Linux内核中锁的实现比初始化为值1的基本信号量要微妙得多。也许你听说过


最后,由于与互斥量相比,信号量的使用非常少,因此选择互斥量作为标准库的公共接口是有意义的。

“这让我想到了”-为什么?两者都不是更高层次的抽象。如果你想坚持一种关系,那么互斥是信号量的一种特殊情况。@kabanus好吧,因为当你用其他东西构建东西时,它通常意味着前者是比后者更高层次的抽象…?不一定。注意,您可以从信号量(set count=1)构建互斥,反之亦然。“互斥体”在某种意义上更小,但我认为很难将一个定义为比另一个更高的抽象。两者的更高抽象可以是一个通用的“锁”,例如,定义锁的通用规则,但不保证实现。我认为,在C++中实现互斥体而不是信号量的选择是任意的。有一些带有信号量的非标准库,没有事实上的答案。“更高层次的抽象”不是一个具有普遍接受的定义的技术术语。我曾多次使用信号量实现条件变量类型,并使用条件变量实现信号量类型。我认为这个问题毫无用处。“这让我思考”——为什么?两者都不是更高层次的抽象。如果你想坚持一种关系,那么互斥是信号量的一种特殊情况。@kabanus好吧,因为当你用其他东西构建东西时,它通常意味着前者是比后者更高层次的抽象…?不一定。注意,您可以从信号量(set count=1)构建互斥,反之亦然。“互斥体”在某种意义上更小,但我认为很难将一个定义为比另一个更高的抽象。两者的更高抽象可以是一个通用的“锁”,例如,定义锁的通用规则,但不保证实现。我认为,在C++中实现互斥体而不是信号量的选择是任意的。有一些带有信号量的非标准库,没有事实上的答案。“更高层次的抽象”不是一个具有普遍接受的定义的技术术语。我曾多次使用信号量实现条件变量类型,并使用条件变量实现信号量类型。我认为这个问题毫无用处。