官术网_书友最值得收藏!

Using the SemaphoreSlim construct

This recipe will show how to SemaphoreSlim is a lightweight version of Semaphore; it limits the number of threads that can access a resource concurrently.

Getting ready

To step through this recipe, you will need Visual Studio 2012. There are no other prerequisites. The source code for this recipe could be found at BookSamples\Chapter2\Recipe3.

How to do it...

To understand limiting a multithreaded access to a resource with the help of the SemaphoreSlim construct, perform the following steps:

  1. Start Visual Studio 2012. Create a new C# Console Application project.
  2. In the Program.cs file add the following using directives:
    using System;
    using System.Threading;
  3. Below the Main method, add the following code snippet:
    static SemaphoreSlim _semaphore = new SemaphoreSlim(4);
    static void AccessDatabase(string name, int seconds)
    {
      Console.WriteLine("{0} waits to access a database", name);
      _semaphore.Wait();
      Console.WriteLine("{0} was granted an access to a database",name);
      Thread.Sleep(TimeSpan.FromSeconds(seconds));
      Console.WriteLine("{0} is completed", name);
      _semaphore.Release();
    
    }
  4. Inside the Main method, add the following code snippet:
    for (int i = 1; i <= 6; i++)
    {
      string threadName = "Thread " + i;
      int secondsToWait = 2 + 2*i;
      var t = new Thread(() => AccessDatabase(threadName, secondsToWait));
      t.Start();
    }
  5. Run the program.

How it works...

When the main program starts, it creates a SemaphoreSlim instance, specifying the number of concurrent threads allowed in its constructor. Then it starts six threads with different names and start times to run.

Every thread is trying to acquire an access to a database, but we restrict the number of concurrent accesses to a database by four threads with the help of a semaphore. When four threads get an access to a database, the other two threads wait until one of the previous threads finishes its work and signals by calling the _semaphore.Release method.

There's more…

Here we use a hybrid construct, which allows us to save a context switch in cases where the wait time is less. However, there is an older version of this construct called Semaphore. This version is a pure, kernel-time construct. There is no sense in using it, except in one very important scenario; we can create a named semaphore like a named mutex and use it to synchronize threads in different programs. SemaphoreSlim does not use Windows kernel semaphores and does not support interprocess synchronization, so use Semaphore in this case.

主站蜘蛛池模板: 怀柔区| 英吉沙县| 安图县| 十堰市| 岳普湖县| 遵义市| 肥西县| 西安市| 河曲县| 通许县| 原平市| 沅陵县| 景泰县| 铜陵市| 安阳市| 蒲城县| 迁西县| 新干县| 信阳市| 呈贡县| 上饶县| 龙南县| 东至县| 建阳市| 赤壁市| 广州市| 临安市| 四子王旗| 镇江市| 黄龙县| 即墨市| 柞水县| 平顶山市| 和顺县| 塔城市| 靖宇县| 夏河县| 清新县| 伊金霍洛旗| 华亭县| 南宁市|