【问题标题】:Avoid this race condition in C# program在 C# 程序中避免这种竞争条件
【发布时间】:2012-02-22 16:09:58
【问题描述】:

我正在开发一个 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 将具有空/无意义的值。

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

【问题讨论】:

  • 我没有发现问题。函数StartMain 将一直工作,直到工作完成。工作完成后,C# 应用程序将获得执行控制权并继续调用ReturnIntExp。这里没有问题。

标签: c# c++ visual-c++ c#-4.0


【解决方案1】:

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

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

另外,为什么StartMain() 在填写值之前返回?

【讨论】:

  • 这也可以在 StartMain() 中完成以在最后返回一个finish code int。所以,我可以继续检查这个代码的循环,直到它给我绿色信号。因为在这种情况下,我无法找出 xExpcExp 的实际情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2010-09-25
相关资源
最近更新 更多