神秘的P / Invoke线程死锁(仅限单声道?)

时间:2014-10-24 11:54:07

标签: c# multithreading mono pinvoke deadlock

对于我无法控制的C库的P / Invoke调用,我遇到了这个奇怪的问题 基本上我有一个线程,其中连续调用本机方法(GetData)和第二个本机方法(包含在托管方法中)(SetSetting),在主线程上偶尔调用一次。 这两个方法可能永远不会同时被调用,或者我收到错误,因此我将其包装到lock块中。
现在奇怪的是,如果我调用SetSetting,只要GetData方法到达SetSetting关键字,该程序就会在lock方法中挂起。 为了使它更清晰,有些代码:

object lobj = new object();  //The lock object

public void SetSetting()    //The managed method calling the second native method
{
    lock(lobj)
    {
        NativeSetSetting();    //native method (irrelevant as it hangs before it's called)
    }
}

public void ContinuousGetData()    //Method that is running in a different thread
{
    while(DoStuff == true)
    {
        lock(lobj)
        {
            GetData();    //native method that hangs
        }
        //here is some other code happening that gives enough time to
        //not constantly block the lock from this thread
        //(it's not relevant to the problem, I tried that)
    }
} 

所以这个过程看起来像这样:

  • 使用ContinuousGetData方法
  • 开始新主题
  • 致电SetSetting方法
  • 执行到达lock方法
  • 中的SetSetting关键字
  • 程序挂起,如果我在调试窗口中按暂停,则指向本机'GetData`方法

同步线程同步(例如ResetEvents)会发生同样的事情 这让我觉得本机调用是在主线程上执行的(SetSetting正在等待本机调用完成)并且它无法执行,因为它正在等待自己。

更多信息:

  • 问题只发生在Mono for Mac(Windows上运行.Net)
  • 本机库在Mac和Windows上有所不同(但我不知道多少)
  • 它始终挂在同一个本机通话中(有多个,但只有这一个通过USB对摄像机进行PTP呼叫)

这是Mono在Mac上的可能行为还是您认为在平台特定的本机库中它是一种不同的处理方式? 我还能做些什么来安全地同步线程吗?

我对任何帮助感到高兴

0 个答案:

没有答案