2012-10-29 41 views
3

因此,在我正在编写的程序中,我有三个函数,为简单起见,我们称它们为A,B和C.每个功能需要访问资源X才能工作。锁/条件变量问题

限制是A和B不允许同时运行,并且必须适当同步。 C允许与A或B同时运行。

这导致了一些问题。

首先,我尝试在A和B上放置锁,因此当A被调用时,它获取对X的锁,然后释放它并与B相同。这样A和B就按顺序运行。但是,如果我以这种方式使用锁定,C无法与A或B同时运行。

所以我尝试使用条件变量,其中A必须等待来自B的信号,如果B正在运行且B必须等待来自A的信号,但是这种相互依赖的呼叫似乎也不起作用。

不知道该怎么做。

+0

如果从C到资源的访问不需要被序列化,那么你不需要对C进行任何锁定但是这是一个非常奇怪的情况(同时运行不会有'这意味着他们可以在同一时刻访问共享资源)。请发布更多关于你想要做什么以及你正在使用的操作系统/语言的详细信息 –

+0

我在我的Mac上用C写我的代码。所以这里的共享资源是银行的一个分支,功能A和B分别是取款和存款,C是转账。我不应该同时从同一分行(即使在分行的不同账户)进行提款和存款,但只要进行转账的账户与分行不同,我可以在分行内同时进行转账处理存款/取款的人。这与保持总分支平衡不被破坏有关。 – user1782677

+0

所以只是不要把任何锁定转移(但你必须以某种方式锁定在较低的水平帐户)。如何实现这取决于你正在使用的是什么(这是一个例子,你直接访问数据库?你与某种服务交谈?)。就我个人而言,我不会使用双锁,所以我会使用帐户级别的锁定(对于A,B和C)扩展到_any account_ for A和B.因为这些操作来自人类用户,您可能会认为使用像A/B对C的数据库常用的_optimistic lock_和A和B的简单sw锁。 –

回答

0

没有控制语言,只谈论理论,似乎有一个简单的方法。如果X是持久的,并且A,B和C可以以接触X的方式被调用,那么A,B和C应该在访问X时通过它们的名字,例如通过称为D的方法。是什么D做的:

  • 在调用方名称和参数。
  • 如果呼叫者是C,传递参数到X.
  • 如果呼叫者是A或B,检查是否有对X.
  • 锁定如果没有锁定,发送的参数X.
  • 如果有锁,请等待开门。

因此,基本上用X包装D.你甚至可以进一步简化,并有一个锁定或非锁定参数而不是名称。如果锁定,检查锁定并可能等待,如果不锁定,则传递参数。

这种方法可能看起来过于简单,但我不知道你的实际情况。我看到前一个问题也被问到了,所以我不知道你是否需要帮助。