C # и C ++ Синхронизация между процессами - PullRequest
5 голосов
/ 02 февраля 2010

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

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

Ади Барда

Ответы [ 3 ]

9 голосов
/ 02 февраля 2010

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

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

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

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

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

В С ++

//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);

In 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 должны быть одинаковыми.

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

1 голос
/ 02 февраля 2010

Посмотрите на этот поток для методов, чтобы разделить некоторую память для целей синхронизации или здесь для некоторых предложений по синхронизации в .net / c #.

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

1 голос
/ 02 февраля 2010

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

В C # у вас есть класс System.Threading.Semaphore.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...