У нас есть 2 приложения. Один записанный в C# и другой в C++. Мы должны поддержать счетчик (в памяти) совместно использованный этими процессами. Каждый раз одно из этих приложений запускаются, оно должно проверить на этот счетчик и увеличить его и каждый раз завершение работы приложения, оно должно уменьшить счетчик. Если приложение имеет катастрофический отказ или завершение работы с помощью диспетчера задач, нам также нужно в противоречии с уменьшением.
Мы думали об использовании одного из объектов синхронизации ОС как ВЗАИМНОЕ ИСКЛЮЧЕНИЕ.
Мой вопрос: Какой синхронизирующий объект является лучшим для перекрестного процесса (когда каждый - C# и другой C++),
Надеюсь, что мой вопрос был ясен.
Большое спасибо,
Adi Barda
Именованный семафор может сойти с рук. Семафор - это в основном счетчик, он здесь, чтобы позволить разработчикам ограничивать количество потоков / процессов, которые обращаются к некоторому ресурсу. Обычно это работает так
WaitForSingleObject
или аналогичные, и каждый из них продолжает работу без ожидания. Каждый раз внутренний счетчик семафоров опускается. ReleaseSemaphore
. Эта функция увеличивает внутренний счетчик семафора. Я не думаю, что это то, как вы хотите его использовать. Поэтому вместо этого вам следует:
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, очевидно, должны быть одинаковыми.
Если этого недостаточно для вашей задачи, вам придется заглянуть в разделяемую память и заблокировать доступ к ней, используя имя мьютекса, но это немного сложнее.
Похоже, вам нужен названный семафор (CreateSemaphore): http://msdn.microsoft.com/en-us/library/ms682438 (vs.85) .aspx для C ++, который подходит для увеличение / уменьшение.
в C # У вас есть System.Threading.semaphore класс.
Поместите в этом потоке для методов для определения некоторых памяти для целей синхронизации или здесь для некоторых предложений для синхронизации в .NET / C #.
Если есть доступные методы .NET, они должны работать как для C ++, так и C # ..