2012-07-05 80 views

回答

6

的.NET框架提供了Semaphore,這樣會是使一個最簡單的方法:

var s = new Semaphore(2, 0); 

但我猜面試官更感興趣的是它背後的結構..

您只需要一個全局託管的訪問控制實體,外部實體可以調用該實體來獲取和釋放鎖。在C#中,你可以通過託管一個Web服務或遠程類來公開類似的方法,並且可以保持活動鎖的數量。

當達到鎖定限制時,您只需返回否定響應(如false)以表示無法獲得鎖定。

改編自Parv Sharma的評論。你可能正在看這樣的事情。信號量需要鎖定對resources的訪問(因爲獲取一個信號槽也是一個保護動作),但resources本身就是控制號碼可用的鎖。然後,應用程序邏輯將決定究竟是什麼被鎖定。

class CustomSemaphore 
{ 
    private static readonly object semaphoreLock = new object(); 
    private static readonly object[] resources = new[] { new object(), new object(), new object(), new object(), new object(), }; 

    public int AcquireLockObject() 
    { 
     lock (semaphoreLock) 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       if (Monitor.TryEnter(resources[i])) 
        return i; 
      } 
     } 

     return -1; // Lock unsuccessful. 
    } 

    public void ReleaseLockObject(int lockIndex) 
    { 
     // Sanity check lockIndex range etc. 

     lock (semaphoreLock) 
     { 
      Monitor.Exit(resources[lockIndex]); 
     } 
    } 
} 
+0

是啊是要寫相同的答案 –

+1

@Adriano很明顯,我是在滔滔不絕。這完全取決於有關的工作。對於一個標準的軟件開發角色,我會爭論使用一個經過驗證的測試實現,這個實現是免費的,而不是承擔自定義實現的所有權,這種實現不會帶來額外的好處,而且會花費更多的金錢/時間。如果這項工作是技術性的,他將負責這項工作,那麼語言是不重要的,做這件事的邏輯是重要的。 –

+0

@Adriano:如果我一直在尋找一個脫口秀諧星我會邀請你:),但現在你的評論是毫無意義的 – JavaSa

相關問題