首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphEngine中的死锁

GraphEngine中的死锁
EN

Stack Overflow用户
提问于 2017-03-05 18:23:48
回答 1查看 132关注 0票数 4

在使用GraphEngine一段时间后,我经常发现自己在对GraphEngine执行某些操作时遇到了死锁的线程。嵌套调用肯定不在菜单上。但现在我遇到了一些奇怪的事情:

代码语言:javascript
复制
foreach(long cellID ...)
{
    byte[] buffer;

    // the next line will block on the 54th call...
    Global.LocalStorage.LoadCell(cellID, out buffer);
}

怀疑是不存在的cellID,我用它包装了调用

代码语言:javascript
复制
if(Global.LocalStorage.Contains(cellID))
{ ... }

但是现在这个调用被无限期地阻塞了。

这是一个bug吗?或

在什么情况下,调用会被阻塞?

再见,安德烈亚斯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 18:35:09

@Andreas Hassmann,我遇到过类似的问题,所以我猜你的麻烦可能是由foreach-loop中的...引起的。

我使用了像Global.LocalStorage.xxxCell_Accessor_Selector().Select(c => c.CellID.Value)这样的迭代器。在这种情况下,存储的锁还没有被释放,这会导致Global.LocalStorage.LoadCell()获取锁时出现死锁。

如果您的问题与我的问题完全相同,那么解决方案就是将.ToList()应用于迭代器。

这是我用来重现你的问题的代码。

TSL:

代码语言:javascript
复制
cell struct MyCell 
{
    int A; 
}

代码:

代码语言:javascript
复制
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.");
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42607155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档