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

时间:2016-12-19 08:09:24

标签: c++ multithreading c++11 synchronization

当我搜索如何在C ++ 11中使用信号量时,我看到人们经常建议我从std::mutexstd::condition_variable(例如this post)中创建一个信号量。这让我觉得信号量是一种比互斥和条件变量更高级的抽象。

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

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

1 个答案:

答案 0 :(得分:2)

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

当您在内核中声明时,您没有说明您引用的内核。标准库必须与内核一样不可知,因此选择最常用的接口。并非所有内核都以完全相同的方式实现锁定。

例如,Linux内核中锁的实现比初始化为值1的基本信号量更加微妙。也许您听说过futexes

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