gpt4 book ai didi

c++ - 关于如何在 2 个参与者之间同步的建议——一个从列表中添加/删除,另一个是清理列表

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:34 24 4
gpt4 key购买 nike

我需要设计和 C++ 实现方面的建议(我是 Java 专家,刚接触 C++)。

我有进程列表。一个线程向列表添加/删除进程,第二个线程每 10 毫秒运行一次并收集所有超时的进程(并将它们从列表中删除)。每个进程在添加到列表时都有一个创建时间戳。如果 3 秒过去了并且该进程仍在列表中(未被第一个线程删除),则它会被更清洁的进程从列表中删除。

这必须具有低开销。

所以我有 processListContainer 和 3 个方法:添加、删除、清理

需要在 add/removeById 和 clean 之间同步。这可以通过巧妙的思考来完成,例如在清理时创建一个新列表,并处理多个列表。

列表大小约为 100K,每秒添加数千

最佳答案

您可以将进程列表组织成子列表列表。每个子列表都是将在相同的 5 毫秒间隔内过期的进程的集合。这将允许您的 cleaner 线程在决定删除陈旧进程时清除整个子列表,而不是循环访问各个进程。

列表最初包含一个空的子列表。

clean 操作是一个循环,退出条件是头子列表为空或头子列表不可过期。如果头子列表已过期,它会清除列表。如果列表有超过 1 个子列表,它会删除生成的空子列表。循环重复。

因此,add 将检查进程是否属于最后一个子列表。如果是这样,它将自己添加到该子列表中。如果没有,它会创建一个新的子列表,并将自己添加到其中,并将子列表添加到列表中。

remove 元素从子列表中移除提供的元素。如果子列表变空,并且列表中有多个子列表,则删除空子列表。

在这个方案中,add 不需要锁定,因为它只操作尾部,或者一个不可过期的子列表。 cleanremove 都需要锁,因为它们都可能操作列表的头部。

关于c++ - 关于如何在 2 个参与者之间同步的建议——一个从列表中添加/删除,另一个是清理列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11366476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com