English 中文(简体)
• 如何实施一个有休止的妇联锁?
原标题:How to implement a recursive MRSW lock?
  • 时间:2009-08-31 09:53:44
  •  标签:

我无需为我的项目设置一个全面、反复的多读/编织式的锁(共享的旋转录)——我不同意这样的观点,即如果你完全吻合,那么你就不需要这些架子(在提升邮寄名单上对此进行了一些讨论),就我而言,锁应当保护一个完全透明的切身,而不管怎么说,这些藏匿点都是不易的。

关于休妻的故事,我认为,唯一有意义的是,除了暂时释放共有的一组人外,还要获得排他性的锁,在排他性释放后再获得。

un锁可等待,但我可以这样生活——写作很少会发生,而休止的锁定通常只能通过休养式的代码途径进行,在这种情况下,打电话者必须准备,呼吁在任何情况下都会等待。 为了避免这种情况,人们仍然可以简单地提升锁,而不是使用休养锁。

在排他性的顶点上建立一个共同的锁,显然只会增加锁定。

因此,问题变成了——我如何执行? 通常采用批判性章节和两条ema光处理的办法,因为,正如我所看到的那样,醒来的read子必须穿透,把它插入锁定者地图。

我相信,这有两种情况变数和两种变数,但使用像我的先令太大的间接费这样的声音的同步压价。

我刚刚想到的一个想法是利用TLS来记住锁定的Im(可能还有当地的锁定)。 想到这一点——但我现在仍然把问题摆在桌面上。

具体目标平台是Win32,但确实如此。 请注意,Im专门瞄准Win2k, 与WMRSW在Windows 7上锁定价格相关的任何东西对我来说都无关。

问题回答

奥凯解决了这个问题。

它只能用2只ema光、一个关键部分,而且几乎不再锁定一个固定的无风险的MRSW锁(显然,由于必须管理多图,24小时多花一些时间)——但滴滴。 我来到这里的结构如下:


// Protects everything that follows, except mWriterThreadId and mRecursiveUpgrade
CRITICAL_SECTION mLock;
// Semaphore to wait on for a read lock
HANDLE mSemaReader;
// Semaphore to wait on for a write lock
HANDLE mSemaWriter;
// Number of threads waiting for a write lock.
int mWriterWaiting;
// Number of times the writer entered the write lock.
int mWriterActive;
// Number of threads inside a read lock. Note that this does not include
// recursive read locks.
int mReaderActiveThreads;
// Whether or not the current writer obtained the lock by a recursive 
// upgrade. Note that this member might be set outside the critical
// section, so it should only be read from by the writer during his
// unlock.
bool mRecursiveUpgrade;
// This member contains the current thread id once for each
// (recursive) read lock held by the current thread in addition to an 
// undefined number of other thread ids which may or may not hold a 
// read lock, even inside the critical section (!).
std::multiset<unsigned long> mReaderActive;
// If there is no writer this member contains 0.
// If the current thread is the writer this member contains his
// thread-id.
// Otherwise it can contain either of them, even inside the 
// critical section (!).
// Also note that it might be set outside the critical section.
unsigned long mWriterThreadId;

现在的基本想法是:

全天候的<代码>mWriterWaiting和mWriterActive由不间断的校正进行。

<代码>mWriterThreadId和mReaderActive是不可能做到的,因为等待读写者在释放时需要插入自己。

因此,这条规则是,你不得接触到这两名成员、<>除外>,以检查你是否持有24小时或现任作者,具体来说,这不得用来检查是否存在任何>读物/作者,因为你必须使用(有点多余但出于这一原因必须的)<编码>mReaderActiveThreads和mWriterActive

目前,我行着一些测试法(它一直处于无僵局和无坠毁状态30分钟左右),当时我相信它会保持稳定,我清理了这部法律,我把它放在了某些 past子上,并在此评论中增加了一个环节(如果其他人需要的话)。

我确实想到了。 从简单的“两条ema光和一个关键部分”开始,在结构上增加了一个作者的记号,并增加了一个自己的作者TID。

僵局仍然占了新地位的大部分。 阅读者通常会增加24小时计数——休庭锁只会增加一个没有存在的阅读器。

作者栏目 我比较了自己掌握的TID,如果作者已经拥有书写锁柜台,就会增加。

新的作者TID无法按锁定做——它不知道谁会被击.,但如果作者们在一锁中将它重新打到零,那么它不会成为一个问题——目前的read子已经是零,因此是一种原子操作。

所有声音都很简单——一个新生问题留下: 作者在等待时,再读的锁将陷入僵局。 而我不知道如何解决这一缺陷,不去做恶魔的锁...... 我需要知道,我是否已经拥有一个读机锁。

在我认识到现有位置数目可能相当有限之后,使用TLS就没有太大了。

根据我的理解,你需要为你的作者提供独家查阅数据的机会,而读者可以同时运作(如果这不是你想要的,请澄清你的问题)。

我认为,你需要实施某种“恶性ema光”,即一种ema光,在出现积极性时会阻挡一线透镜,并在零时表示所有等待线。 如果你这样做,你就能够用两种这种幻觉来实施你的方案。 那么,你的镜子的运行可以如下:

Reader:
(1) wait on sem A
(2) increase sem B
(3) read operation
(4) decrease sem B

Writer:
(1) increase sem A 
(2) wait on sem B
(3) write operation
(4) decrease sem A

这样,一旦所有待决读者都读完,作者将立即进行书面工作。 撰稿人一旦完成学业,就能够恢复工作,而不会相互阻碍。

我不熟悉Windows mutex/semaphore设施,但我可以想出一种办法,利用SPOSIX的透镜APIC(结合变体、反射和有条件变量)。





相关问题