semaphore.synchronize块内的Ruby返回

semaphore.synchronize块内的Ruby返回,ruby,mutex,Ruby,Mutex,我想知道如果我这样做,信号量是否会释放锁: def test semaphore.syncronize do if (access_shared_resource) return "Condition A" else return "Condition B" end end end 运行此函数的线程是否会继续持有此锁,直到其终止?或者return语句会释放锁吗?根据文档,它将在完成块(传递给syncronize的块)后释放: 为了在这个

我想知道如果我这样做,信号量是否会释放锁:

def test
  semaphore.syncronize do
    if (access_shared_resource)
      return "Condition A"
    else
      return "Condition B"
    end
  end
end

运行此函数的线程是否会继续持有此锁,直到其终止?或者
return
语句会释放锁吗?

根据文档,它将在完成块(传递给
syncronize
的块)后释放:

为了在这个答案被否决时提供更多的证据,下面是synchronize的实现。我不是C方面的专家,但从我在这里看到的情况来看,解锁是在Sure中实现的,所以这个互斥锁将在块终止时解锁,无论它是通过跳转返回还是离开:

快速建模也支持这一点:

从块返回是很棘手的,在不同的ruby实现中,返回堆栈帧的方式可能有所不同。尽可能避免从block返回(提示:总是可能的。)

使用
break
,而不是在收益上挣扎,它是干净的,并且具有非常明确的行为:

def test
  semaphore.syncronize do
    if (access_shared_resource)
      break "Condition A"
    else
      break "Condition B"
    end
  end
end

或者,如果在自然块离开前存在一些代码:

def test
  case
    semaphore.syncronize do
      break :continue if (normal_condition)
      if (access_shared_resource)
        break :accessed
      else
        break :not_accessed
      end
    end
  when :accessed then "Condition A"
  when :not_accessed then "Condition B"
  else
    # normal control flow
  end
end

您可以在同步方法之前使用一个变量,在块内获得分配给该变量的返回值,然后在块执行完成后使用分配的值访问该变量。

+1以避免在块中返回。即使它与MRI一起工作,也不能保证它与其他实现一起工作。除此之外,它看起来很凌乱,很难跟随程序流程。你能不能在一些代码中回答这个问题以及解释?我是问信号量是否会在返回后移除锁。另外,仅供参考,如果您想给出一个好的答案,请编写一个代码片段,或者包含链接。这使得解释答案更加容易。哦,是的,欢迎来到社区,@phundi