C# и C++ Синхронизируются между процессами

У нас есть 2 приложения. Один записанный в C# и другой в C++. Мы должны поддержать счетчик (в памяти) совместно использованный этими процессами. Каждый раз одно из этих приложений запускаются, оно должно проверить на этот счетчик и увеличить его и каждый раз завершение работы приложения, оно должно уменьшить счетчик. Если приложение имеет катастрофический отказ или завершение работы с помощью диспетчера задач, нам также нужно в противоречии с уменьшением.
Мы думали об использовании одного из объектов синхронизации ОС как ВЗАИМНОЕ ИСКЛЮЧЕНИЕ.
Мой вопрос: Какой синхронизирующий объект является лучшим для перекрестного процесса (когда каждый - C# и другой C++),

Надеюсь, что мой вопрос был ясен.
Большое спасибо,

Adi Barda

5
задан Adi Barda 2 February 2010 в 09:57
поделиться

3 ответа

Именованный семафор может сойти с рук. Семафор - это в основном счетчик, он здесь, чтобы позволить разработчикам ограничивать количество потоков / процессов, которые обращаются к некоторому ресурсу. Обычно это работает так

  1. Вы создаете семафор с максимальным счетчиком N.
  2. N потоков вызывают на нем функцию ожидания, WaitForSingleObject или аналогичные, и каждый из них продолжает работу без ожидания. Каждый раз внутренний счетчик семафоров опускается.
  3. N + 1 поток также вызывает функцию ожидания, но поскольку внутренний счетчик нашего семафора теперь равен 0, он должен ждать.
  4. Один из наших первых N потоков освобождает семафор, вызывая функцию ReleaseSemaphore . Эта функция увеличивает внутренний счетчик семафора.
  5. Нашему ожидающему потоку теперь не нужно ждать, поэтому он возобновляется, но счетчик семафоров возвращается к 0.

Я не думаю, что это то, как вы хотите его использовать. Поэтому вместо этого вам следует:

  1. Создать именованный семафор с начальным счетчиком, установленным на ноль.
  2. При запуске приложения немедленно отпустите его, увеличив счетчик. Вы получите предыдущее значение счетчика во время этого вызова.
  3. По завершении работы приложения вызовите WaitForSingleObject (hSemaphore, 0) , уменьшив счетчик. 0 означает, что вы не хотите ждать.

Это все довольно просто.

В C ++

//create semaphore
HANDLER hSemaphore = CreateSemaphore(NULL, 0, BIG_NUMBER, "My cool semaphore name");
//increase counter
LONG prev_counter;
ReleaseSemaphore(hSemaphore, 1, &prev_counter);
//decrease counter
WaitForSingleObject(hSemaphore, 0);

В C #

using System.Threading;
//create semaphore
Semaphore sem = new Semaphore(0, BIG_NUMBER, "My cool semaphore name");
//increase counter
int prev_counter = sem.Release(); 
//decrease counter
sem.WaitOne(0);

Имена и BIG_NUMBER, очевидно, должны быть одинаковыми.

Если этого недостаточно для вашей задачи, вам придется заглянуть в разделяемую память и заблокировать доступ к ней, используя имя мьютекса, но это немного сложнее.

9
ответ дан 13 December 2019 в 19:27
поделиться

Похоже, вам нужен названный семафор (CreateSemaphore): http://msdn.microsoft.com/en-us/library/ms682438 (vs.85) .aspx для C ++, который подходит для увеличение / уменьшение.

в C # У вас есть System.Threading.semaphore класс.

1
ответ дан 13 December 2019 в 19:27
поделиться

Поместите в этом потоке для методов для определения некоторых памяти для целей синхронизации или здесь для некоторых предложений для синхронизации в .NET / C #.

Если есть доступные методы .NET, они должны работать как для C ++, так и C # ..

1
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: