Избегайте этого состояния гонки в программе C # - PullRequest
0 голосов
/ 22 февраля 2012

Я работаю над приложением C # и сталкиваюсь со странной проблемой. У меня есть .dll, которая была встроена в C ++, и я должен вызывать некоторые функции из этого .dll из приложения C #.

Рассмотрим этот пример кода:

public partial class MainWindows: Window
{
public MainWindow()
{
InitializeComponent();
ConfigurationFunctions.StartMain(); //Start main is the DLL function in C++ 

int x = ConfigurationFunctions.ReturnIntExp();
StringBuilder sb = ConfigurationOptions.ReturnSomethingExp();
}
}

C ++ .cpp файл

EXPORT_API int xExp;
EXPORT_API char cExp; 
EXPORT_API StartMain()
{
//Calculate `x` and `y` in this program values here and allocate to variables to be returned from function
xExp = x;
cExp = c;
}
EXPORT_API int ReturnIntExp()
{
return xExp;
}
EXPORT_API char ReturnSomethingExp()
{
return cExp;
}

Проблема в том, что когда я запускаю функцию StartMain() из .dll, она вычисляет некоторые значения для int и char, которые должны быть назначены переменным (которые фактически возвращаются в приложение C #)

Но после StartMain() приложение C # должно дождаться завершения функции StartMain() (которая в этом случае занимает приблизительно 3-4 секунды, а сама dll запускает два / три других процесса) и только затем продолжить работу или же переменные x и sb в приложении C # будут иметь пустые / бессмысленные значения.

Как я могу добиться того же в этом случае?

1 Ответ

2 голосов
/ 22 февраля 2012

Добавьте третью экспортированную переменную ReturnIsReady(), которая возвращает true, если два других метода содержат значимые данные, и false в противном случае. Затем просто сделайте цикл со сном, чтобы проверить это значение, пока оно не изменится.

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

В качестве альтернативы, почему StartMain() возвращается до заполнения значений?

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