Semaphore Конструкторы
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Инициализирует новый экземпляр класса Semaphore.
Перегрузки
| Имя | Описание |
|---|---|
| Semaphore(Int32, Int32) |
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей. |
| Semaphore(Int32, Int32, String) |
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, а также при необходимости указывая имя объекта системного семафора. |
| Semaphore(Int32, Int32, String, Boolean) |
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, при необходимости указывая имя объекта системного семафора и указывая переменную, которая получает значение, указывающее, был ли создан новый системный семафор. |
| Semaphore(Int32, Int32, String, NamedWaitHandleOptions) |
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, а также при необходимости указывая имя объекта системного семафора и параметры для задания доступа к области пользователя и области сеанса. |
| Semaphore(Int32, Int32, String, Boolean, SemaphoreSecurity) |
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, при необходимости указывая имя объекта системного семафора, указывая переменную, которая получает значение, указывающее, был ли создан новый системный семафор и указывая управление доступом безопасности для системного семафора. |
| Semaphore(Int32, Int32, String, NamedWaitHandleOptions, Boolean) |
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, при необходимости указывая имя объекта системного семафора и параметры для задания доступа к области пользователя и области сеанса и указания переменной, которая получает значение, указывающее, был ли создан новый системный семафор. |
Semaphore(Int32, Int32)
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей.
public:
Semaphore(int initialCount, int maximumCount);
public Semaphore(int initialCount, int maximumCount);
new System.Threading.Semaphore : int * int -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer)
Параметры
- initialCount
- Int32
Начальное число запросов для семафора, которое может быть предоставлено одновременно.
- maximumCount
- Int32
Максимальное количество запросов для семафора, которое может быть предоставлено одновременно.
Исключения
initialCount больше maximumCount.
Примеры
В следующем примере создается семафор с максимальным числом трех и начальным числом нуля. В примере начинаются пять потоков, которые блокируют ожидание семафора. Основной поток использует Release(Int32) перегрузку метода для увеличения числа семафора до максимального, что позволяет трем потокам входить в семафор. Каждый поток использует Thread.Sleep метод для ожидания одной секунды, для имитации работы, а затем вызывает Release() перегрузку метода, чтобы освободить семафор. Каждый раз при выпуске семафора отображается предыдущее число семафоров. Сообщения консоли отслеживают использование семафора. Имитированный рабочий интервал немного увеличивается для каждого потока, чтобы упростить чтение выходных данных.
using System;
using System.Threading;
public class Example
{
// A semaphore that simulates a limited resource pool.
//
private static Semaphore _pool;
// A padding interval to make the output more orderly.
private static int _padding;
public static void Main()
{
// Create a semaphore that can satisfy up to three
// concurrent requests. Use an initial count of zero,
// so that the entire semaphore count is initially
// owned by the main program thread.
//
_pool = new Semaphore(initialCount: 0, maximumCount: 3);
// Create and start five numbered threads.
//
for(int i = 1; i <= 5; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(Worker));
// Start the thread, passing the number.
//
t.Start(i);
}
// Wait for half a second, to allow all the
// threads to start and to block on the semaphore.
//
Thread.Sleep(500);
// The main thread starts out holding the entire
// semaphore count. Calling Release(3) brings the
// semaphore count back to its maximum value, and
// allows the waiting threads to enter the semaphore,
// up to three at a time.
//
Console.WriteLine("Main thread calls Release(3).");
_pool.Release(releaseCount: 3);
Console.WriteLine("Main thread exits.");
}
private static void Worker(object num)
{
// Each worker thread begins by requesting the
// semaphore.
Console.WriteLine("Thread {0} begins " +
"and waits for the semaphore.", num);
_pool.WaitOne();
// A padding interval to make the output more orderly.
int padding = Interlocked.Add(ref _padding, 100);
Console.WriteLine("Thread {0} enters the semaphore.", num);
// The thread's "work" consists of sleeping for
// about a second. Each thread "works" a little
// longer, just to make the output more orderly.
//
Thread.Sleep(1000 + padding);
Console.WriteLine("Thread {0} releases the semaphore.", num);
Console.WriteLine("Thread {0} previous semaphore count: {1}",
num, _pool.Release());
}
}
Imports System.Threading
Public Class Example
' A semaphore that simulates a limited resource pool.
'
Private Shared _pool As Semaphore
' A padding interval to make the output more orderly.
Private Shared _padding As Integer
<MTAThread> _
Public Shared Sub Main()
' Create a semaphore that can satisfy up to three
' concurrent requests. Use an initial count of zero,
' so that the entire semaphore count is initially
' owned by the main program thread.
'
_pool = New Semaphore(0, 3)
' Create and start five numbered threads.
'
For i As Integer = 1 To 5
Dim t As New Thread(New ParameterizedThreadStart(AddressOf Worker))
'Dim t As New Thread(AddressOf Worker)
' Start the thread, passing the number.
'
t.Start(i)
Next i
' Wait for half a second, to allow all the
' threads to start and to block on the semaphore.
'
Thread.Sleep(500)
' The main thread starts out holding the entire
' semaphore count. Calling Release(3) brings the
' semaphore count back to its maximum value, and
' allows the waiting threads to enter the semaphore,
' up to three at a time.
'
Console.WriteLine("Main thread calls Release(3).")
_pool.Release(3)
Console.WriteLine("Main thread exits.")
End Sub
Private Shared Sub Worker(ByVal num As Object)
' Each worker thread begins by requesting the
' semaphore.
Console.WriteLine("Thread {0} begins " _
& "and waits for the semaphore.", num)
_pool.WaitOne()
' A padding interval to make the output more orderly.
Dim padding As Integer = Interlocked.Add(_padding, 100)
Console.WriteLine("Thread {0} enters the semaphore.", num)
' The thread's "work" consists of sleeping for
' about a second. Each thread "works" a little
' longer, just to make the output more orderly.
'
Thread.Sleep(1000 + padding)
Console.WriteLine("Thread {0} releases the semaphore.", num)
Console.WriteLine("Thread {0} previous semaphore count: {1}", _
num, _
_pool.Release())
End Sub
End Class
Комментарии
Этот конструктор инициализирует неназванный семафор. Все потоки, использующие экземпляр такого семафора, должны иметь ссылки на экземпляр.
Если initialCount значение меньше maximumCount, то эффект совпадает с тем, что текущий поток вызвал WaitOne (maximumCount минус initialCount) время. Если вы не хотите зарезервировать записи для потока, создающего семафор, используйте то же число для maximumCount и initialCount.
См. также раздел
Применяется к
Semaphore(Int32, Int32, String)
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, а также при необходимости указывая имя объекта системного семафора.
public:
Semaphore(int initialCount, int maximumCount, System::String ^ name);
public Semaphore(int initialCount, int maximumCount, string name);
public Semaphore(int initialCount, int maximumCount, string? name);
new System.Threading.Semaphore : int * int * string -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String)
Параметры
- initialCount
- Int32
Начальное число запросов для семафора, которое может быть предоставлено одновременно.
- maximumCount
- Int32
Максимальное количество запросов для семафора, которое может быть предоставлено одновременно.
- name
- String
Имя, если объект синхронизации должен использоваться совместно с другими процессами; null в противном случае или пустая строка. Имя учитывает регистр. Символ обратной косой черты (\) зарезервирован и может использоваться только для указания пространства имен. Дополнительные сведения о пространствах имен см. в разделе примечаний. В зависимости от операционной системы могут быть дополнительные ограничения на имя. Например, в операционных системах на основе Unix имя после исключения пространства имен должно быть допустимым именем файла.
Исключения
initialCount больше maximumCount.
–или–
только .NET Framework: name больше MAX_PATH (260 символов).
name недопустим. Это может быть по разным причинам, включая некоторые ограничения, которые могут быть помещены операционной системой, например неизвестный префикс или недопустимые символы. Обратите внимание, что имя и распространенные префиксы "Global\" и "Local\" чувствительны к регистру.
–или–
Произошла другая ошибка. Свойство HResult может предоставить дополнительные сведения.
Windows только: name указало неизвестное пространство имен. Дополнительные сведения см. в разделе "Имена объектов ".
Слишком длинное значение name. Ограничения длины могут зависеть от операционной системы или конфигурации.
Именованный семафор существует и имеет безопасность управления доступом, и у пользователя нет FullControl.
Не удается создать объект синхронизации с предоставленным name объектом. Объект синхронизации другого типа может иметь то же имя.
Примеры
В следующем примере кода демонстрируется кросспроцессное поведение именованного семафора. В примере создается именованный семафор с максимальным числом пяти и начальным числом из пяти. Программа выполняет три вызова WaitOne метода. Таким образом, если выполнить скомпилированный пример из двух командных окон, вторая копия будет блокироваться на третьем вызове WaitOne. Отпустите одну или несколько записей в первой копии программы, чтобы разблокировать второй.
using System;
using System.Threading;
public class Example
{
public static void Main()
{
// Create a Semaphore object that represents the named
// system semaphore "SemaphoreExample3". The semaphore has a
// maximum count of five. The initial count is also five.
// There is no point in using a smaller initial count,
// because the initial count is not used if this program
// doesn't create the named system semaphore, and with
// this method overload there is no way to tell. Thus, this
// program assumes that it is competing with other
// programs for the semaphore.
//
Semaphore sem = new Semaphore(5, 5, "SemaphoreExample3");
// Attempt to enter the semaphore three times. If another
// copy of this program is already running, only the first
// two requests can be satisfied. The third blocks. Note
// that in a real application, timeouts should be used
// on the WaitOne calls, to avoid deadlocks.
//
sem.WaitOne();
Console.WriteLine("Entered the semaphore once.");
sem.WaitOne();
Console.WriteLine("Entered the semaphore twice.");
sem.WaitOne();
Console.WriteLine("Entered the semaphore three times.");
// The thread executing this program has entered the
// semaphore three times. If a second copy of the program
// is run, it will block until this program releases the
// semaphore at least once.
//
Console.WriteLine("Enter the number of times to call Release.");
int n;
if (int.TryParse(Console.ReadLine(), out n))
{
sem.Release(n);
}
int remaining = 3 - n;
if (remaining > 0)
{
Console.WriteLine("Press Enter to release the remaining " +
"count ({0}) and exit the program.", remaining);
Console.ReadLine();
sem.Release(remaining);
}
}
}
Imports System.Threading
Public Class Example
<MTAThread> _
Public Shared Sub Main()
' Create a Semaphore object that represents the named
' system semaphore "SemaphoreExample3". The semaphore has a
' maximum count of five. The initial count is also five.
' There is no point in using a smaller initial count,
' because the initial count is not used if this program
' doesn't create the named system semaphore, and with
' this method overload there is no way to tell. Thus, this
' program assumes that it is competing with other
' programs for the semaphore.
'
Dim sem As New Semaphore(5, 5, "SemaphoreExample3")
' Attempt to enter the semaphore three times. If another
' copy of this program is already running, only the first
' two requests can be satisfied. The third blocks. Note
' that in a real application, timeouts should be used
' on the WaitOne calls, to avoid deadlocks.
'
sem.WaitOne()
Console.WriteLine("Entered the semaphore once.")
sem.WaitOne()
Console.WriteLine("Entered the semaphore twice.")
sem.WaitOne()
Console.WriteLine("Entered the semaphore three times.")
' The thread executing this program has entered the
' semaphore three times. If a second copy of the program
' is run, it will block until this program releases the
' semaphore at least once.
'
Console.WriteLine("Enter the number of times to call Release.")
Dim n As Integer
If Integer.TryParse(Console.ReadLine(), n) Then
sem.Release(n)
End If
Dim remaining As Integer = 3 - n
If (remaining) > 0 Then
Console.WriteLine("Press Enter to release the remaining " _
& "count ({0}) and exit the program.", remaining)
Console.ReadLine()
sem.Release(remaining)
End If
End Sub
End Class
Комментарии
Этот конструктор инициализирует Semaphore объект, представляющий именованный системный семафор. Можно создать несколько Semaphore объектов, представляющих те же именованные системные семафоры.
Может name быть префиксирован или Global\Local\ указано пространство имен.
Global При указании пространства имен объект синхронизации может быть предоставлен совместно с любыми процессами в системе.
Local Если указано пространство имен, которое также является значением по умолчанию, если пространство имен не указано, объект синхронизации может быть предоставлен совместно с процессами в одном сеансе. В Windows сеанс является сеансом входа, а службы обычно выполняются в другом неинтерактивном сеансе. В операционных системах, таких как Unix, каждая оболочка имеет свой собственный сеанс. Объекты локальной синхронизации сеанса могут быть подходящими для синхронизации между процессами с отношением родительского или дочернего, где все они выполняются в одном сеансе. Дополнительные сведения о именах объектов синхронизации в Windows см. в разделе Object Names.
name Если указан и объект синхронизации запрошенного типа уже существует в пространстве имен, используется существующий объект синхронизации. Если объект синхронизации другого типа уже существует в пространстве имен, WaitHandleCannotBeOpenedException создается исключение. В противном случае создается новый объект синхронизации.
Если именованный системный семафор не существует, он создается с начальным числом и максимальным числом, заданным initialCount и maximumCount. Если именованный системный семафор уже существует и initialCount не используется, maximumCount хотя недопустимые значения по-прежнему вызывают исключения. Если необходимо определить, был ли создан именованный системный семафор, используйте Semaphore(Int32, Int32, String, Boolean) перегрузку конструктора.
Это важно
При использовании этой перегрузки конструктора рекомендуется указать одинаковое число для initialCount и maximumCount. Если initialCount значение меньше maximumCount, а именованный системный семафор создается, эффект такой же, как если бы текущий поток вызвал WaitOne (maximumCount минус initialCount) время. Однако при перегрузке конструктора нет способа определить, был ли создан именованный системный семафор.
Если задана null или пустая строка для name, создается локальный семафор, как если бы вы вызвали перегрузку конструктора Semaphore(Int32, Int32) .
Так как именованные семафоры видны во всей операционной системе, их можно использовать для координации использования ресурсов через границы процесса.
Если вы хотите узнать, существует ли именованный системный семафор, используйте OpenExisting этот метод. Метод OpenExisting пытается открыть существующий именованный семафор и вызывает исключение, если системный семафор не существует.
Предостережение
По умолчанию именованный семафор не ограничивается пользователем, создающим его. Другие пользователи могут открывать и использовать семафор, включая вмешательство в семафор путем получения семафора несколько раз и не выпуская его. Чтобы ограничить доступ к определенным пользователям, можно использовать перегрузку конструктора или SemaphoreAcl передать ее при SemaphoreSecurity создании именованного семафора. Избегайте использования именованных семафоров без ограничений доступа к системам, у которых могут быть ненадежные пользователи, выполняющие код.
См. также раздел
Применяется к
Semaphore(Int32, Int32, String, Boolean)
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, при необходимости указывая имя объекта системного семафора и указывая переменную, которая получает значение, указывающее, был ли создан новый системный семафор.
public:
Semaphore(int initialCount, int maximumCount, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew);
public Semaphore(int initialCount, int maximumCount, string name, out bool createdNew);
public Semaphore(int initialCount, int maximumCount, string? name, out bool createdNew);
new System.Threading.Semaphore : int * int * string * bool -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, ByRef createdNew As Boolean)
Параметры
- initialCount
- Int32
Начальное число запросов семафора, которое может быть удовлетворено одновременно.
- maximumCount
- Int32
Максимальное количество запросов для семафора, которое может быть удовлетворено одновременно.
- name
- String
Имя, если объект синхронизации должен использоваться совместно с другими процессами; null в противном случае или пустая строка. Имя учитывает регистр. Символ обратной косой черты (\) зарезервирован и может использоваться только для указания пространства имен. Дополнительные сведения о пространствах имен см. в разделе примечаний. В зависимости от операционной системы могут быть дополнительные ограничения на имя. Например, в операционных системах на основе Unix имя после исключения пространства имен должно быть допустимым именем файла.
- createdNew
- Boolean
Когда этот метод возвращается, содержит true , был ли создан локальный семафор (то есть, если name это null или пустая строка) или если был создан указанный именованный системный семафор, false если указанный именованный системный семафор уже существовал. Этот параметр передается неинициализирован.
Исключения
initialCount больше maximumCount.
–или–
только .NET Framework: name больше MAX_PATH (260 символов).
name недопустим. Это может быть по разным причинам, включая некоторые ограничения, которые могут быть помещены операционной системой, например неизвестный префикс или недопустимые символы. Обратите внимание, что имя и распространенные префиксы "Global\" и "Local\" чувствительны к регистру.
–или–
Произошла другая ошибка. Свойство HResult может предоставить дополнительные сведения.
Windows только: name указало неизвестное пространство имен. Дополнительные сведения см. в разделе "Имена объектов ".
Слишком длинное значение name. Ограничения длины могут зависеть от операционной системы или конфигурации.
Именованный семафор существует и имеет безопасность управления доступом, и у пользователя нет FullControl.
Не удается создать объект синхронизации с предоставленным name объектом. Объект синхронизации другого типа может иметь то же имя.
Примеры
В следующем примере кода демонстрируется кросспроцессное поведение именованного семафора. В примере создается именованный семафор с максимальным числом пяти и начальным числом из двух. То есть он резервирует три записи для потока, вызывающего конструктор. Если createNew это falseтак, программа выполняет три вызова WaitOne метода. Таким образом, если выполнить скомпилированный пример из двух командных окон, вторая копия будет блокироваться на третьем вызове WaitOne. Отпустите одну или несколько записей в первой копии программы, чтобы разблокировать второй.
using System;
using System.Threading;
public class Example
{
public static void Main()
{
// The value of this variable is set by the semaphore
// constructor. It is true if the named system semaphore was
// created, and false if the named semaphore already existed.
//
bool semaphoreWasCreated;
// Create a Semaphore object that represents the named
// system semaphore "SemaphoreExample". The semaphore has a
// maximum count of five, and an initial count of two. The
// Boolean value that indicates creation of the underlying
// system object is placed in semaphoreWasCreated.
//
Semaphore sem = new Semaphore(2, 5, "SemaphoreExample",
out semaphoreWasCreated);
if (semaphoreWasCreated)
{
// If the named system semaphore was created, its count is
// set to the initial count requested in the constructor.
// In effect, the current thread has entered the semaphore
// three times.
//
Console.WriteLine("Entered the semaphore three times.");
}
else
{
// If the named system semaphore was not created,
// attempt to enter it three times. If another copy of
// this program is already running, only the first two
// requests can be satisfied. The third blocks.
//
sem.WaitOne();
Console.WriteLine("Entered the semaphore once.");
sem.WaitOne();
Console.WriteLine("Entered the semaphore twice.");
sem.WaitOne();
Console.WriteLine("Entered the semaphore three times.");
}
// The thread executing this program has entered the
// semaphore three times. If a second copy of the program
// is run, it will block until this program releases the
// semaphore at least once.
//
Console.WriteLine("Enter the number of times to call Release.");
int n;
if (int.TryParse(Console.ReadLine(), out n))
{
sem.Release(n);
}
int remaining = 3 - n;
if (remaining > 0)
{
Console.WriteLine("Press Enter to release the remaining " +
"count ({0}) and exit the program.", remaining);
Console.ReadLine();
sem.Release(remaining);
}
}
}
Imports System.Threading
Public Class Example
<MTAThread> _
Public Shared Sub Main()
' The value of this variable is set by the semaphore
' constructor. It is True if the named system semaphore was
' created, and False if the named semaphore already existed.
'
Dim semaphoreWasCreated As Boolean
' Create a Semaphore object that represents the named
' system semaphore "SemaphoreExample". The semaphore has a
' maximum count of five, and an initial count of two. The
' Boolean value that indicates creation of the underlying
' system object is placed in semaphoreWasCreated.
'
Dim sem As New Semaphore(2, 5, "SemaphoreExample", _
semaphoreWasCreated)
If semaphoreWasCreated Then
' If the named system semaphore was created, its count is
' set to the initial count requested in the constructor.
' In effect, the current thread has entered the semaphore
' three times.
'
Console.WriteLine("Entered the semaphore three times.")
Else
' If the named system semaphore was not created,
' attempt to enter it three times. If another copy of
' this program is already running, only the first two
' requests can be satisfied. The third blocks.
'
sem.WaitOne()
Console.WriteLine("Entered the semaphore once.")
sem.WaitOne()
Console.WriteLine("Entered the semaphore twice.")
sem.WaitOne()
Console.WriteLine("Entered the semaphore three times.")
End If
' The thread executing this program has entered the
' semaphore three times. If a second copy of the program
' is run, it will block until this program releases the
' semaphore at least once.
'
Console.WriteLine("Enter the number of times to call Release.")
Dim n As Integer
If Integer.TryParse(Console.ReadLine(), n) Then
sem.Release(n)
End If
Dim remaining As Integer = 3 - n
If (remaining) > 0 Then
Console.WriteLine("Press Enter to release the remaining " _
& "count ({0}) and exit the program.", remaining)
Console.ReadLine()
sem.Release(remaining)
End If
End Sub
End Class
Комментарии
Может name быть префиксирован или Global\Local\ указано пространство имен.
Global При указании пространства имен объект синхронизации может быть предоставлен совместно с любыми процессами в системе.
Local Если указано пространство имен, которое также является значением по умолчанию, если пространство имен не указано, объект синхронизации может быть предоставлен совместно с процессами в одном сеансе. В Windows сеанс является сеансом входа, а службы обычно выполняются в другом неинтерактивном сеансе. В операционных системах, таких как Unix, каждая оболочка имеет свой собственный сеанс. Объекты локальной синхронизации сеанса могут быть подходящими для синхронизации между процессами с отношением родительского или дочернего, где все они выполняются в одном сеансе. Дополнительные сведения о именах объектов синхронизации в Windows см. в разделе Object Names.
name Если указан и объект синхронизации запрошенного типа уже существует в пространстве имен, используется существующий объект синхронизации. Если объект синхронизации другого типа уже существует в пространстве имен, WaitHandleCannotBeOpenedException создается исключение. В противном случае создается новый объект синхронизации.
Этот конструктор инициализирует Semaphore объект, представляющий именованный системный семафор. Можно создать несколько Semaphore объектов, представляющих те же именованные системные семафоры.
Если именованный системный семафор не существует, он создается с начальным числом и максимальным числом, заданным initialCount и maximumCount. Если именованный системный семафор уже существует и initialCount не используется, maximumCount хотя недопустимые значения по-прежнему вызывают исключения. Используется createdNew для определения того, был ли создан системный семафор.
Если initialCount значение меньше maximumCount, и createdNew имеет trueзначение, то эффект совпадает с тем, что текущий поток вызвал WaitOne (maximumCount минус initialCount) время.
Если задана null или пустая строка для name, создается локальный семафор, как если бы вы вызвали перегрузку конструктора Semaphore(Int32, Int32) . В этом случае createdNew всегда true.
Так как именованные семафоры видны во всей операционной системе, их можно использовать для координации использования ресурсов через границы процесса.
Предостережение
По умолчанию именованный семафор не ограничивается пользователем, создающим его. Другие пользователи могут открывать и использовать семафор, включая вмешательство в семафор путем получения семафора несколько раз и не выпуская его. Чтобы ограничить доступ к определенным пользователям, можно использовать перегрузку конструктора или SemaphoreAcl передать ее при SemaphoreSecurity создании именованного семафора. Избегайте использования именованных семафоров без ограничений доступа к системам, у которых могут быть ненадежные пользователи, выполняющие код.
См. также раздел
Применяется к
Semaphore(Int32, Int32, String, NamedWaitHandleOptions)
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, а также при необходимости указывая имя объекта системного семафора и параметры для задания доступа к области пользователя и области сеанса.
public:
Semaphore(int initialCount, int maximumCount, System::String ^ name, System::Threading::NamedWaitHandleOptions options);
public Semaphore(int initialCount, int maximumCount, string? name, System.Threading.NamedWaitHandleOptions options);
new System.Threading.Semaphore : int * int * string * System.Threading.NamedWaitHandleOptions -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, options As NamedWaitHandleOptions)
Параметры
- initialCount
- Int32
Начальное число запросов семафора, которое может быть удовлетворено одновременно.
- maximumCount
- Int32
Максимальное количество запросов для семафора, которое может быть удовлетворено одновременно.
- name
- String
Имя, если объект синхронизации должен использоваться совместно с другими процессами; null в противном случае или пустая строка. Имя учитывает регистр.
- options
- NamedWaitHandleOptions
Параметры области для именованного семафора. По умолчанию доступ ограничен текущим пользователем и текущим сеансом. Указанные параметры могут повлиять на пространство имен для имени и доступа к базовому объекту семафора.
Исключения
name недопустим. Это может быть по разным причинам, включая некоторые ограничения, которые могут быть помещены операционной системой, например неизвестный префикс или недопустимые символы. Обратите внимание, что имя и распространенные префиксы "Global\" и "Local\" чувствительны к регистру.
–или–
Произошла другая ошибка. Свойство HResult может предоставить дополнительные сведения.
Windows только: name указало неизвестное пространство имен. Дополнительные сведения см. в разделе "Имена объектов ".
Слишком длинное значение name. Ограничения длины могут зависеть от операционной системы или конфигурации.
Именованный семафор существует и имеет безопасность управления доступом, и у пользователя нет FullControl.
Не удается создать объект синхронизации с предоставленным name объектом. Объект синхронизации другого типа может иметь то же имя.
–или–
Объект с указанным name существует, но указанный options не совместим с параметрами существующего объекта.
Комментарии
Этот конструктор инициализирует Semaphore объект, представляющий именованный системный семафор. Можно создать несколько Semaphore объектов, представляющих те же именованные системные семафоры.
name Если указан и объект синхронизации запрошенного типа уже существует в пространстве имен, существующий объект синхронизации используется, если options только не указан доступ к текущему пользователю, а объект синхронизации несовместим с ним, в этом случае WaitHandleCannotBeOpenedException возникает исключение. Если объект синхронизации другого типа уже существует в пространстве имен, WaitHandleCannotBeOpenedException создается также. В противном случае создается новый объект синхронизации.
Если именованный системный семафор не существует, он создается с начальным числом и максимальным числом, заданным initialCount и maximumCount. Если именованный системный семафор уже существует и initialCount не используется, maximumCount хотя недопустимые значения по-прежнему вызывают исключения. Если необходимо определить, был ли создан именованный системный семафор, используйте Semaphore(Int32, Int32, String, Boolean) перегрузку конструктора.
Это важно
При использовании этой перегрузки конструктора рекомендуется указать одинаковое число для initialCount и maximumCount. Если initialCount значение меньше maximumCount, а именованный системный семафор создается, эффект такой же, как если бы текущий поток вызвал WaitOne (maximumCount минус initialCount) время. Однако при перегрузке конструктора невозможно определить, был ли создан именованный системный семафор.
Если задана null или пустая строка для name, создается локальный семафор, как если бы вы вызвали перегрузку конструктора Semaphore(Int32, Int32) .
Так как именованные семафоры видны во всей операционной системе, их можно использовать для координации использования ресурсов через границы процесса.
Если вы хотите узнать, существует ли именованный системный семафор, используйте OpenExisting этот метод. Метод OpenExisting пытается открыть существующий именованный семафор и вызывает исключение, если системный семафор не существует.
В Windows options можно указать, доступен ли именованный семафор только текущему пользователю или всем пользователям. Он также позволяет указать, доступен ли именованный семафор для процессов только в текущем сеансе или ко всем сеансам. Дополнительные сведения см. в разделе NamedWaitHandleOptions.
Предостережение
В операционных системах на основе Unix параметр не влияет, options так как именованные семафоры не поддерживаются.
См. также раздел
Применяется к
Semaphore(Int32, Int32, String, Boolean, SemaphoreSecurity)
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, при необходимости указывая имя объекта системного семафора, указывая переменную, которая получает значение, указывающее, был ли создан новый системный семафор и указывая управление доступом безопасности для системного семафора.
public:
Semaphore(int initialCount, int maximumCount, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew, System::Security::AccessControl::SemaphoreSecurity ^ semaphoreSecurity);
public Semaphore(int initialCount, int maximumCount, string name, out bool createdNew, System.Security.AccessControl.SemaphoreSecurity semaphoreSecurity);
new System.Threading.Semaphore : int * int * string * bool * System.Security.AccessControl.SemaphoreSecurity -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, ByRef createdNew As Boolean, semaphoreSecurity As SemaphoreSecurity)
Параметры
- initialCount
- Int32
Начальное число запросов семафора, которое может быть удовлетворено одновременно.
- maximumCount
- Int32
Максимальное количество запросов для семафора, которое может быть удовлетворено одновременно.
- name
- String
Имя, если объект синхронизации должен использоваться совместно с другими процессами; null в противном случае или пустая строка. Имя учитывает регистр. Символ обратной косой черты (\) зарезервирован и может использоваться только для указания пространства имен. Дополнительные сведения о пространствах имен см. в разделе примечаний. В зависимости от операционной системы могут быть дополнительные ограничения на имя. Например, в операционных системах на основе Unix имя после исключения пространства имен должно быть допустимым именем файла.
- createdNew
- Boolean
Когда этот метод возвращается, содержит true , был ли создан локальный семафор (то есть, если name это null или пустая строка) или если был создан указанный именованный системный семафор, false если указанный именованный системный семафор уже существовал. Этот параметр передается неинициализирован.
- semaphoreSecurity
- SemaphoreSecurity
Объект SemaphoreSecurity , представляющий безопасность управления доступом, применяемый к именованной системной семафоре.
Исключения
initialCount больше maximumCount.
–или–
только .NET Framework: name больше MAX_PATH (260 символов).
Именованный семафор существует и имеет безопасность управления доступом, и у пользователя нет FullControl.
name недопустим. Это может быть по разным причинам, включая некоторые ограничения, которые могут быть помещены операционной системой, например неизвестный префикс или недопустимые символы. Обратите внимание, что имя и распространенные префиксы "Global\" и "Local\" чувствительны к регистру.
–или–
Произошла другая ошибка. Свойство HResult может предоставить дополнительные сведения.
Windows только: name указало неизвестное пространство имен. Дополнительные сведения см. в разделе "Имена объектов ".
Слишком длинное значение name. Ограничения длины могут зависеть от операционной системы или конфигурации.
Не удается создать объект синхронизации с предоставленным name объектом. Объект синхронизации другого типа может иметь то же имя.
Примеры
В следующем примере кода демонстрируется кросспроцессное поведение именованного семафора с безопасностью управления доступом. В примере используется перегрузка OpenExisting(String) метода для проверки существования именованного семафора. Если семафор не существует, он создается с максимальным числом двух и с безопасностью управления доступом, которая запрещает текущему пользователю право использовать семафор, но предоставляет право на чтение и изменение разрешений на семафор. Если выполнить скомпилированный пример из двух командных окон, вторая копия вызовет исключение нарушения доступа при вызове OpenExisting(String) метода. Исключение поймано, и в примере используется OpenExisting(String, SemaphoreRights) перегрузка метода для открытия семафора с правами, необходимыми для чтения и изменения разрешений.
После изменения разрешений семафор открывается с правами, необходимыми для ввода и выпуска. Если выполнить скомпилированный пример из третьего командного окна, он запускается с помощью новых разрешений.
using System;
using System.Threading;
using System.Security.AccessControl;
internal class Example
{
internal static void Main()
{
const string semaphoreName = "SemaphoreExample5";
Semaphore sem = null;
bool doesNotExist = false;
bool unauthorized = false;
// Attempt to open the named semaphore.
try
{
// Open the semaphore with (SemaphoreRights.Synchronize
// | SemaphoreRights.Modify), to enter and release the
// named semaphore.
//
sem = Semaphore.OpenExisting(semaphoreName);
}
catch(WaitHandleCannotBeOpenedException)
{
Console.WriteLine("Semaphore does not exist.");
doesNotExist = true;
}
catch(UnauthorizedAccessException ex)
{
Console.WriteLine("Unauthorized access: {0}", ex.Message);
unauthorized = true;
}
// There are three cases: (1) The semaphore does not exist.
// (2) The semaphore exists, but the current user doesn't
// have access. (3) The semaphore exists and the user has
// access.
//
if (doesNotExist)
{
// The semaphore does not exist, so create it.
//
// The value of this variable is set by the semaphore
// constructor. It is true if the named system semaphore was
// created, and false if the named semaphore already existed.
//
bool semaphoreWasCreated;
// Create an access control list (ACL) that denies the
// current user the right to enter or release the
// semaphore, but allows the right to read and change
// security information for the semaphore.
//
string user = Environment.UserDomainName + "\\"
+ Environment.UserName;
SemaphoreSecurity semSec = new SemaphoreSecurity();
SemaphoreAccessRule rule = new SemaphoreAccessRule(
user,
SemaphoreRights.Synchronize | SemaphoreRights.Modify,
AccessControlType.Deny);
semSec.AddAccessRule(rule);
rule = new SemaphoreAccessRule(
user,
SemaphoreRights.ReadPermissions | SemaphoreRights.ChangePermissions,
AccessControlType.Allow);
semSec.AddAccessRule(rule);
// Create a Semaphore object that represents the system
// semaphore named by the constant 'semaphoreName', with
// maximum count three, initial count three, and the
// specified security access. The Boolean value that
// indicates creation of the underlying system object is
// placed in semaphoreWasCreated.
//
sem = new Semaphore(3, 3, semaphoreName,
out semaphoreWasCreated, semSec);
// If the named system semaphore was created, it can be
// used by the current instance of this program, even
// though the current user is denied access. The current
// program enters the semaphore. Otherwise, exit the
// program.
//
if (semaphoreWasCreated)
{
Console.WriteLine("Created the semaphore.");
}
else
{
Console.WriteLine("Unable to create the semaphore.");
return;
}
}
else if (unauthorized)
{
// Open the semaphore to read and change the access
// control security. The access control security defined
// above allows the current user to do this.
//
try
{
sem = Semaphore.OpenExisting(
semaphoreName,
SemaphoreRights.ReadPermissions
| SemaphoreRights.ChangePermissions);
// Get the current ACL. This requires
// SemaphoreRights.ReadPermissions.
SemaphoreSecurity semSec = sem.GetAccessControl();
string user = Environment.UserDomainName + "\\"
+ Environment.UserName;
// First, the rule that denied the current user
// the right to enter and release the semaphore must
// be removed.
SemaphoreAccessRule rule = new SemaphoreAccessRule(
user,
SemaphoreRights.Synchronize | SemaphoreRights.Modify,
AccessControlType.Deny);
semSec.RemoveAccessRule(rule);
// Now grant the user the correct rights.
//
rule = new SemaphoreAccessRule(user,
SemaphoreRights.Synchronize | SemaphoreRights.Modify,
AccessControlType.Allow);
semSec.AddAccessRule(rule);
// Update the ACL. This requires
// SemaphoreRights.ChangePermissions.
sem.SetAccessControl(semSec);
Console.WriteLine("Updated semaphore security.");
// Open the semaphore with (SemaphoreRights.Synchronize
// | SemaphoreRights.Modify), the rights required to
// enter and release the semaphore.
//
sem = Semaphore.OpenExisting(semaphoreName);
}
catch(UnauthorizedAccessException ex)
{
Console.WriteLine("Unable to change permissions: {0}", ex.Message);
return;
}
}
// Enter the semaphore, and hold it until the program
// exits.
//
try
{
sem.WaitOne();
Console.WriteLine("Entered the semaphore.");
Console.WriteLine("Press the Enter key to exit.");
Console.ReadLine();
sem.Release();
}
catch(UnauthorizedAccessException ex)
{
Console.WriteLine("Unauthorized access: {0}", ex.Message);
}
}
}
Imports System.Threading
Imports System.Security.AccessControl
Friend Class Example
<MTAThread> _
Friend Shared Sub Main()
Const semaphoreName As String = "SemaphoreExample5"
Dim sem As Semaphore = Nothing
Dim doesNotExist as Boolean = False
Dim unauthorized As Boolean = False
' Attempt to open the named semaphore.
Try
' Open the semaphore with (SemaphoreRights.Synchronize
' Or SemaphoreRights.Modify), to enter and release the
' named semaphore.
'
sem = Semaphore.OpenExisting(semaphoreName)
Catch ex As WaitHandleCannotBeOpenedException
Console.WriteLine("Semaphore does not exist.")
doesNotExist = True
Catch ex As UnauthorizedAccessException
Console.WriteLine("Unauthorized access: {0}", ex.Message)
unauthorized = True
End Try
' There are three cases: (1) The semaphore does not exist.
' (2) The semaphore exists, but the current user doesn't
' have access. (3) The semaphore exists and the user has
' access.
'
If doesNotExist Then
' The semaphore does not exist, so create it.
'
' The value of this variable is set by the semaphore
' constructor. It is True if the named system semaphore was
' created, and False if the named semaphore already existed.
'
Dim semaphoreWasCreated As Boolean
' Create an access control list (ACL) that denies the
' current user the right to enter or release the
' semaphore, but allows the right to read and change
' security information for the semaphore.
'
Dim user As String = Environment.UserDomainName _
& "\" & Environment.UserName
Dim semSec As New SemaphoreSecurity()
Dim rule As New SemaphoreAccessRule(user, _
SemaphoreRights.Synchronize Or SemaphoreRights.Modify, _
AccessControlType.Deny)
semSec.AddAccessRule(rule)
rule = New SemaphoreAccessRule(user, _
SemaphoreRights.ReadPermissions Or _
SemaphoreRights.ChangePermissions, _
AccessControlType.Allow)
semSec.AddAccessRule(rule)
' Create a Semaphore object that represents the system
' semaphore named by the constant 'semaphoreName', with
' maximum count three, initial count three, and the
' specified security access. The Boolean value that
' indicates creation of the underlying system object is
' placed in semaphoreWasCreated.
'
sem = New Semaphore(3, 3, semaphoreName, _
semaphoreWasCreated, semSec)
' If the named system semaphore was created, it can be
' used by the current instance of this program, even
' though the current user is denied access. The current
' program enters the semaphore. Otherwise, exit the
' program.
'
If semaphoreWasCreated Then
Console.WriteLine("Created the semaphore.")
Else
Console.WriteLine("Unable to create the semaphore.")
Return
End If
ElseIf unauthorized Then
' Open the semaphore to read and change the access
' control security. The access control security defined
' above allows the current user to do this.
'
Try
sem = Semaphore.OpenExisting(semaphoreName, _
SemaphoreRights.ReadPermissions Or _
SemaphoreRights.ChangePermissions)
' Get the current ACL. This requires
' SemaphoreRights.ReadPermissions.
Dim semSec As SemaphoreSecurity = sem.GetAccessControl()
Dim user As String = Environment.UserDomainName _
& "\" & Environment.UserName
' First, the rule that denied the current user
' the right to enter and release the semaphore must
' be removed.
Dim rule As New SemaphoreAccessRule(user, _
SemaphoreRights.Synchronize Or SemaphoreRights.Modify, _
AccessControlType.Deny)
semSec.RemoveAccessRule(rule)
' Now grant the user the correct rights.
'
rule = New SemaphoreAccessRule(user, _
SemaphoreRights.Synchronize Or SemaphoreRights.Modify, _
AccessControlType.Allow)
semSec.AddAccessRule(rule)
' Update the ACL. This requires
' SemaphoreRights.ChangePermissions.
sem.SetAccessControl(semSec)
Console.WriteLine("Updated semaphore security.")
' Open the semaphore with (SemaphoreRights.Synchronize
' Or SemaphoreRights.Modify), the rights required to
' enter and release the semaphore.
'
sem = Semaphore.OpenExisting(semaphoreName)
Catch ex As UnauthorizedAccessException
Console.WriteLine("Unable to change permissions: {0}", _
ex.Message)
Return
End Try
End If
' Enter the semaphore, and hold it until the program
' exits.
'
Try
sem.WaitOne()
Console.WriteLine("Entered the semaphore.")
Console.WriteLine("Press the Enter key to exit.")
Console.ReadLine()
sem.Release()
Catch ex As UnauthorizedAccessException
Console.WriteLine("Unauthorized access: {0}", _
ex.Message)
End Try
End Sub
End Class
Комментарии
Используйте этот конструктор для применения безопасности управления доступом к именованной системной семафоре при его создании, предотвращая управление другим кодом семафора.
Может name быть префиксирован или Global\Local\ указано пространство имен.
Global При указании пространства имен объект синхронизации может быть предоставлен совместно с любыми процессами в системе.
Local Если указано пространство имен, которое также является значением по умолчанию, если пространство имен не указано, объект синхронизации может быть предоставлен совместно с процессами в одном сеансе. В Windows сеанс является сеансом входа, а службы обычно выполняются в другом неинтерактивном сеансе. В операционных системах, таких как Unix, каждая оболочка имеет свой собственный сеанс. Объекты локальной синхронизации сеанса могут быть подходящими для синхронизации между процессами с отношением родительского или дочернего, где все они выполняются в одном сеансе. Дополнительные сведения о именах объектов синхронизации в Windows см. в разделе Object Names.
name Если указан и объект синхронизации запрошенного типа уже существует в пространстве имен, используется существующий объект синхронизации. Если объект синхронизации другого типа уже существует в пространстве имен, WaitHandleCannotBeOpenedException создается исключение. В противном случае создается новый объект синхронизации.
Этот конструктор инициализирует Semaphore объект, представляющий именованный системный семафор. Можно создать несколько Semaphore объектов, представляющих те же именованные системные семафоры.
Если именованный системный семафор не существует, он создается с указанной безопасностью управления доступом. Если именованный семафор существует, то указанная безопасность управления доступом игнорируется.
Note
Вызывающий объект имеет полный контроль над вновь созданным Semaphore объектом, даже если semaphoreSecurity запрещает или не предоставляет некоторые права доступа текущему пользователю. Однако если текущий пользователь пытается получить другой объект Semaphore для представления того же именованного семафора, используя конструктор или метод OpenExisting, применяется Windows безопасность управления доступом.
Если именованный системный семафор не существует, он создается с начальным числом и максимальным числом, заданным initialCount и maximumCount. Если именованный системный семафор уже существует и initialCount не используется, maximumCount хотя недопустимые значения по-прежнему вызывают исключения.
createdNew Используйте параметр, чтобы определить, был ли системный семафор создан этим конструктором.
Если initialCount значение меньше maximumCount, и createdNew имеет trueзначение, то эффект совпадает с тем, что текущий поток вызвал WaitOne (maximumCount минус initialCount) время.
Если задана null или пустая строка для name, создается локальный семафор, как если бы вы вызвали перегрузку конструктора Semaphore(Int32, Int32) . В этом случае createdNew всегда true.
Так как именованные семафоры видны во всей операционной системе, их можно использовать для координации использования ресурсов через границы процесса.
Предостережение
По умолчанию именованный семафор не ограничивается пользователем, создающим его. Другие пользователи могут открывать и использовать семафор, включая вмешательство в семафор путем получения семафора несколько раз и не выпуская его. Чтобы ограничить доступ к определенным пользователям, можно передать его SemaphoreSecurity при создании именованного семафора. Избегайте использования именованных семафоров без ограничений доступа к системам, у которых могут быть ненадежные пользователи, выполняющие код.
См. также раздел
Применяется к
Semaphore(Int32, Int32, String, NamedWaitHandleOptions, Boolean)
- Исходный код:
- Semaphore.cs
- Исходный код:
- Semaphore.cs
Инициализирует новый экземпляр Semaphore класса, указывая начальное число записей и максимальное число одновременных записей, при необходимости указывая имя объекта системного семафора и параметры для задания доступа к области пользователя и области сеанса и указания переменной, которая получает значение, указывающее, был ли создан новый системный семафор.
public:
Semaphore(int initialCount, int maximumCount, System::String ^ name, System::Threading::NamedWaitHandleOptions options, [Runtime::InteropServices::Out] bool % createdNew);
public Semaphore(int initialCount, int maximumCount, string? name, System.Threading.NamedWaitHandleOptions options, out bool createdNew);
new System.Threading.Semaphore : int * int * string * System.Threading.NamedWaitHandleOptions * bool -> System.Threading.Semaphore
Public Sub New (initialCount As Integer, maximumCount As Integer, name As String, options As NamedWaitHandleOptions, ByRef createdNew As Boolean)
Параметры
- initialCount
- Int32
Начальное число запросов семафора, которое может быть удовлетворено одновременно.
- maximumCount
- Int32
Максимальное количество запросов для семафора, которое может быть удовлетворено одновременно.
- name
- String
Имя, если объект синхронизации должен использоваться совместно с другими процессами; null в противном случае или пустая строка. Имя учитывает регистр.
- options
- NamedWaitHandleOptions
Параметры области для именованного семафора. По умолчанию доступ ограничен текущим пользователем и текущим сеансом. Указанные параметры могут повлиять на пространство имен для имени и доступа к базовому объекту семафора.
- createdNew
- Boolean
Когда этот метод возвращается, содержит true , если был создан локальный семафор (то есть, если name строка null или пустая строка) или если был создан указанный именованный системный семафор; содержит false , если указанный именованный системный семафор уже существовал. Этот параметр передается неинициализирован.
Исключения
name недопустим. Это может быть по разным причинам, включая некоторые ограничения, которые могут быть помещены операционной системой, например неизвестный префикс или недопустимые символы. Обратите внимание, что имя и распространенные префиксы "Global\" и "Local\" чувствительны к регистру.
–или–
Произошла другая ошибка. Свойство HResult может предоставить дополнительные сведения.
Windows только: name указало неизвестное пространство имен. Дополнительные сведения см. в разделе "Имена объектов ".
Слишком длинное значение name. Ограничения длины могут зависеть от операционной системы или конфигурации.
Именованный семафор существует и имеет безопасность управления доступом, и у пользователя нет FullControl.
Не удается создать объект синхронизации с предоставленным name объектом. Объект синхронизации другого типа может иметь то же имя.
–или–
Объект с указанным name существует, но указанный options не совместим с параметрами существующего объекта.
Комментарии
name Если указан и объект синхронизации запрошенного типа уже существует в пространстве имен, существующий объект синхронизации используется, если options только не указан доступ к текущему пользователю, а объект синхронизации несовместим с ним, в этом случае WaitHandleCannotBeOpenedException возникает исключение. Если объект синхронизации другого типа уже существует в пространстве имен, WaitHandleCannotBeOpenedException создается также. В противном случае создается новый объект синхронизации.
Этот конструктор инициализирует Semaphore объект, представляющий именованный системный семафор. Можно создать несколько Semaphore объектов, представляющих те же именованные системные семафоры.
Если именованный системный семафор не существует, он создается с начальным числом и максимальным числом, заданным initialCount и maximumCount. Если именованный системный семафор уже существует и initialCount не используется, maximumCount хотя недопустимые значения по-прежнему вызывают исключения.
createdNew Используйте параметр, чтобы определить, был ли системный семафор создан этим конструктором.
Если initialCount значение меньше maximumCount, и createdNew имеет trueзначение, то эффект совпадает с тем, что текущий поток вызвал WaitOne (maximumCount минус initialCount) время.
Если задана null или пустая строка для name, создается локальный семафор, как если бы вы вызвали перегрузку конструктора Semaphore(Int32, Int32) . В этом случае createdNew всегда true.
Так как именованные семафоры видны во всей операционной системе, их можно использовать для координации использования ресурсов через границы процесса.
В Windows options можно указать, доступен ли именованный семафор только текущему пользователю или всем пользователям. Он также позволяет указать, доступен ли именованный семафор для процессов только в текущем сеансе или ко всем сеансам. Дополнительные сведения см. в разделе NamedWaitHandleOptions.
Предостережение
В операционных системах на основе Unix параметр не влияет, options так как именованные семафоры не поддерживаются.