对于我无法控制的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
关键字
同步线程同步(例如ResetEvents)会发生同样的事情
这让我觉得本机调用是在主线程上执行的(SetSetting
正在等待本机调用完成)并且它无法执行,因为它正在等待自己。
更多信息:
这是Mono在Mac上的可能行为还是您认为在平台特定的本机库中它是一种不同的处理方式? 我还能做些什么来安全地同步线程吗?
我对任何帮助感到高兴