在C#程序中避免这种竞争条件

本文关键字:竞争 条件 程序 | 更新日期: 2023-09-27 18:25:38

我正在开发一个C#应用程序,在这里遇到了一个奇怪的问题。我有一个用C++构建的.dll,我必须从C#应用程序调用这个.dll中的一些函数。

考虑这个示例代码:

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;
}

问题是,当我从.dll运行StartMain()函数时,它会为intchar计算一些值,这些值必须分配给变量(实际上返回给C#应用程序)

但是,在StartMain()之后,C#应用程序应该等待StartMain()函数完成(在这种情况下,这大约需要3-4秒,dll本身会触发另外两个/三个进程),然后再继续,否则,C#应用中的变量xsb将具有空/无意义的值。

在这种情况下,我如何才能达到同样的效果?

在C#程序中避免这种竞争条件

添加第三个导出变量ReturnIsReady(),如果其他两个方法具有有意义的数据,则返回true,否则返回false。然后简单地进行一个带有睡眠的循环来检查该值,直到它发生变化。

一个更好的选择是实现互斥或类似的结构,但旋转等待应该足以在启动时进行一次该长度的等待。

或者,为什么StartMain()在填充值之前返回?