【发布时间】:2019-04-08 14:27:50
【问题描述】:
简短的问题:POSIX 线程 API 是否为我提供了一种方法来确定调用线程是否已经持有特定的锁?
长问题:
假设我想用锁保护一个数据结构。获取和释放锁需要发生在不同的函数中。所涉及的函数之间的调用相当复杂(我正在向一个 16 岁的代码库添加多线程)。例如:
-
do_dangerous_stuff()执行当前线程需要持有写锁的事情。因此,我在函数开始时获取锁并在结束时释放它,因为调用者不一定持有锁。 - 另一个函数
do_extra_dangerous_stuff()调用do_dangerous_stuff()。但是,在调用之前它已经做了一些需要写锁的事情,并且在对do_dangerous_stuff()的调用返回之前数据是不一致的(因此释放并立即重新获取锁可能会破坏事情)。
实际上它比这更复杂。可能有一堆函数调用do_dangerous_stuff(),要求每个函数在调用do_dangerous_stuff()之前获取锁可能是不切实际的。有时锁在一个函数中被获取并在另一个函数中释放。
使用读锁,我可以从同一个线程多次获取它,只要我确保我释放的锁实例数量与我获取的相同。对于写锁,这不是一个选项(尝试这样做会导致死锁)。一个简单的解决方案是:测试当前线程是否已经持有锁,如果没有则获取它,反之,测试当前线程是否仍然持有锁,如果持有则释放它。但是,这需要我测试当前线程是否已经持有锁——有没有办法做到这一点?
【问题讨论】:
标签: pthreads