7

而不是sizeof(std::atomic<bool>)==1

互斥锁可以通过一个简单std::atomic<bool>的 .

4

3 回答 3

13

有了一个bool,您只能实现自旋锁。请注意,这将是一个不公平的锁,因为没有任何东西可以确保等待者排队,因此在最极端的情况下,在高度争用的情况下,一个线程可能会被永远阻塞,因为它总是会失去获取锁的竞争。

互斥锁实现需要操作系统的支持才能使等待的线程进入睡眠状态。因此,互斥体需要一个标志来表明它是否被锁定,以及某种形式的队列描述符,以允许等待线程进入睡眠状态并唤醒它们。如果您希望互斥锁能够支持递归锁定、健壮性、可选旋转、优先级反转保护等,则需要更多成员。

于 2013-05-22T14:16:10.373 回答
13

GNU 库通常使用 Posix 线程来实现标准线程库。它使用一种类型pthread_mutex_t来表示几种不同类型的互斥锁;因此它包含更复杂的互斥锁所需的各种字段(例如递归互斥锁的计数器),以及一个指定类型的字段。

你是对的,原则上,在操作系统的适当支持下,astd::mutex可以使用少至一个字节的用户内存。(在 Linux 上,它必须是int; 而在其他平台上,它可能是内核资源的整数或指针大小的句柄)。据推测,使用经过良好测试的现有实现的好处被认为超过了每个互斥体节省几十个字节的好处。

于 2013-05-22T14:14:56.350 回答
6

互斥锁可以通过一个简单的实现std::atomic<bool>

mutex::lock考虑到这是必需的操作,并且std::atomic<bool>很可能是非锁定类型,这看起来不太可能。您可以while在调用周围放置一个循环compare_exchange_strong,但这与 不同mutex::lock,因为它在整个等待期间会浪费 CPU。

通常,std::mutex它比具有定义的多线程行为的简单复杂得多bool,解释其相当大的大小,这取决于编译器:例如,在 ideone 上sizeof(mutex)是 24

于 2013-05-22T14:16:26.660 回答