【发布时间】:2012-02-02 16:22:35
【问题描述】:
问题是这样的:
我有一个包含 500 个指针的数组,它们指向双向链表中的 500 个元素。有 10 个线程并行运行。每个线程运行 50 次循环,并尝试释放列表中的某些元素。
列表已排序(包含简单整数),还有10个其他线程并行运行,搜索包含特定整数的节点并访问该节点中的其他卫星数据。所以节点是这样的:
struct node
{
int key; // Key used to search this nodes
int x,y,z; // Satellite data
struct node *prev;
struct node *right;
};
如果我在搜索/删除之前锁定列表,问题很容易解决。但这太粗粒度了。如何同步这些线程,以便获得更好的并发性?
编辑:
- 这不是家庭作业问题。我不属于学术界。
- 包含 500 个指针的数组看起来很奇怪。我这样做是为了以尽可能低的复杂性可视化我的问题。
【问题讨论】:
-
确实是重复的。我的问题更详细地解释了这个场景。
-
可能的最佳并发 将非常密切地取决于您的确切访问模式,这从问题中并不清楚。您是否有 10 个线程基本上遍历同一个链表,每个线程都在寻找要删除的不同键?如果是这样,为什么 - 比较 500 个整数需要多长时间?
-
我编辑了这个问题。一共有20个线程。 10 个删除线程和 10 个搜索线程。搜索线程通过遍历列表进行搜索。删除线程直接删除列表中存在的指针。这个问题只是代表性的,我正在寻找比粗粒度锁更好的东西。
-
所以 - 删除线程正在从列表中删除随机项目,您不希望这样会阻碍搜索者,是吗?
标签: c multithreading memory-management concurrency