【问题标题】:POSIX threads - attempting lock on empty spinlockPOSIX 线程 - 尝试锁定空自旋锁
【发布时间】:2016-04-10 23:36:01
【问题描述】:

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

【问题讨论】:

  • 如果删除意味着不再是一个对象,那么你可以确定它是未定义的行为。
  • 这对我正在尝试做的事情来说是一个好问题 - 对于大学练习,我被要求实现“乐观同步” - 即删除和添加节点在没有锁定的情况下搜索列表,锁定找到之后的节点,然后确保锁定的节点在列表中仍然有效,然后再继续。但后一种验证并没有解决看起来的主要问题——即在查找和锁定节点之间可能会发生一些事情。

标签: c pthreads spinlock


【解决方案1】:

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

对象被删除后,应该被视为处于未初始化状态。 (也取决于在这种情况下,deleted 的定义是什么,我们没有澄清,所以可能会有额外的警告。)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多