GraphEngine 中的死锁
Deadlocks in GraphEngine
使用 GraphEngine 一段时间后,我经常发现自己在对 GraphEngine 进行一些操作时遇到死锁线程。嵌套调用绝对不在菜单上。但是现在我遇到了奇怪的事情:
foreach(long cellID ...)
{
byte[] buffer;
// the next line will block on the 54th call...
Global.LocalStorage.LoadCell(cellID, out buffer);
}
怀疑一个不存在的 cellID 我用
包裹了电话
if(Global.LocalStorage.Contains(cellID))
{ ... }
但是现在这个调用会无限期阻塞。
这是一个错误吗?或
在什么情况下调用会阻塞?
干杯,
安德烈亚斯
@Andreas Hassmann,我遇到过类似的问题,所以我猜你的麻烦可能是foreach循环中的...
引起的。
我使用了像 Global.LocalStorage.xxxCell_Accessor_Selector().Select(c => c.CellID.Value)
这样的迭代器。在这种情况下,存储的锁还没有释放,导致Global.LocalStorage.LoadCell()
获取锁时出现死锁。
如果您的问题与我的完全相同,解决方案是将 .ToList()
应用于迭代器。
这是我的代码来重现您的问题。
TSL:
cell struct MyCell
{
int A;
}
代码:
for (int i = 0; i < 100; i++)
{
MyCell mc = new MyCell(i);
Global.LocalStorage.SaveMyCell(i, mc);
}
var ids = Global.LocalStorage.MyCell_Accessor_Selector().Select(c => c.CellID.Value);
Console.WriteLine("1 start.");
foreach (long cellID in ids.ToList())
{
byte[] buffer;
Global.LocalStorage.LoadCell(cellID, out buffer);
Console.WriteLine(cellID);
}
Console.WriteLine("1 done.");
Console.WriteLine("2 start.");
foreach (long cellID in ids)
{
byte[] buffer;
Global.LocalStorage.LoadCell(cellID, out buffer);
Console.WriteLine(cellID);
}
Console.WriteLine("2 done.");
使用 GraphEngine 一段时间后,我经常发现自己在对 GraphEngine 进行一些操作时遇到死锁线程。嵌套调用绝对不在菜单上。但是现在我遇到了奇怪的事情:
foreach(long cellID ...)
{
byte[] buffer;
// the next line will block on the 54th call...
Global.LocalStorage.LoadCell(cellID, out buffer);
}
怀疑一个不存在的 cellID 我用
包裹了电话if(Global.LocalStorage.Contains(cellID))
{ ... }
但是现在这个调用会无限期阻塞。
这是一个错误吗?或
在什么情况下调用会阻塞?
干杯, 安德烈亚斯
@Andreas Hassmann,我遇到过类似的问题,所以我猜你的麻烦可能是foreach循环中的...
引起的。
我使用了像 Global.LocalStorage.xxxCell_Accessor_Selector().Select(c => c.CellID.Value)
这样的迭代器。在这种情况下,存储的锁还没有释放,导致Global.LocalStorage.LoadCell()
获取锁时出现死锁。
如果您的问题与我的完全相同,解决方案是将 .ToList()
应用于迭代器。
这是我的代码来重现您的问题。
TSL:
cell struct MyCell
{
int A;
}
代码:
for (int i = 0; i < 100; i++)
{
MyCell mc = new MyCell(i);
Global.LocalStorage.SaveMyCell(i, mc);
}
var ids = Global.LocalStorage.MyCell_Accessor_Selector().Select(c => c.CellID.Value);
Console.WriteLine("1 start.");
foreach (long cellID in ids.ToList())
{
byte[] buffer;
Global.LocalStorage.LoadCell(cellID, out buffer);
Console.WriteLine(cellID);
}
Console.WriteLine("1 done.");
Console.WriteLine("2 start.");
foreach (long cellID in ids)
{
byte[] buffer;
Global.LocalStorage.LoadCell(cellID, out buffer);
Console.WriteLine(cellID);
}
Console.WriteLine("2 done.");