2016-01-06 62 views
0

如果我试图锁定无效的pthread类型自旋锁会发生什么?该场景可能发生在使用乐观同步的链表上,在每个节点上利用自旋锁,在找到所需节点的阶段和实际锁定它们之间。当我找到它们时,我对它们有一个有效的参考,但是如果它们是例如在我能够锁定它们之前删除?结果会试图锁定一个NULL指针 - 可以导致程序终止,还是只会使pthread_spin_lock()返回一个特定的值?POSIX线程 - 试图锁定空自旋锁

+1

如果通过删除,你的意思不再是一个对象,那么你可以肯定它是未定义的行为。 – 2501

+0

这是我尝试做的一个很好的问题 - 为了进行大学练习,我被要求实施“乐观同步” - 也就是说,删除和添加节点在没有锁的情况下搜索列表,在发现它们之后锁定节点,以及然后在继续之前确保锁定节点在列表内仍然有效。但后者的验证并没有解决它看起来的主要问题 - 也就是说,查找和锁定节点之间可能会发生一些事情。 –

回答

2

documentation已清除:如果使用未初始化的自旋锁调用这些函数中的任何一个,则结果不确定。

删除一个对象后,它应该被视为处于未初始化状态。 (也取决于在这种情况下删除的定义是什么,我们没有说明,所以可能会有额外的注意事项。)

没有指定如果将NULL传递给函数会发生什么情况。它可能会返回EINVAL:如果实现检测到由pthread_spin_lock()或pthread_spin_trylock()的lock参数指定的值未引用已初始化的旋转锁对象,则建议该函数失败并报告[EINVAL ]错误。