关于如何在两个参与者之间同步的建议-一个添加/从列表中删除,另一个清除列表 我需要设计和C++实现的建议(我是java人,C++新手)。

关于如何在两个参与者之间同步的建议-一个添加/从列表中删除,另一个清除列表 我需要设计和C++实现的建议(我是java人,C++新手)。,c++,multithreading,C++,Multithreading,我有一个进程列表。 一个线程向列表中添加/删除进程,第二个线程每隔10毫秒运行一次,并收集所有超时的进程(并将其从列表中删除)。每个进程在添加到列表时都有一个创建时间戳。如果3秒过去了,进程仍在列表中(第一个线程未删除),则清理进程会将其从列表中删除 这必须是低开销的 所以我有了processListContainer,它有3种方法: 添加、删除、清理 需要在add/removeById和clean之间同步。 这可以通过聪明的想法来实现,比如在清理时创建一个新列表,以及处理多个列表 列表大小约为

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

这必须是低开销的

所以我有了processListContainer,它有3种方法: 添加、删除、清理

需要在add/removeById和clean之间同步。 这可以通过聪明的想法来实现,比如在清理时创建一个新列表,以及处理多个列表


列表大小约为100K,以秒为单位添加了数千个列表。您只需保留一个列表,并使用互斥锁对其进行保护。另外,我会避免使用“更干净”的进程,并让进程在完成后将自己从列表中删除。

您只需要保留一个列表,并使用互斥锁对其进行保护。此外,我还建议避免使用“更干净”的流程,让流程在完成后将自己从列表中删除。

您可以将流程列表组织到子列表中。每个子列表都是在相同的5ms间隔内过期的进程的集合。这将允许
cleaner
线程在决定删除过时进程时清除整个子列表,而不是遍历单个进程

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

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

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

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


在此方案中,
add
不需要锁定,因为它只操作尾部或不可过期的子列表
clean
remove
都需要锁,因为它们都可能操纵列表的头部。

您可以将进程列表组织到子列表中。每个子列表都是在相同的5ms间隔内过期的进程的集合。这将允许
cleaner
线程在决定删除过时进程时清除整个子列表,而不是遍历单个进程

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

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

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

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


在此方案中,
add
不需要锁定,因为它只操作尾部或不可过期的子列表
clean
remove
都需要锁,因为它们都可能操纵列表的头部。

add
始终位于尾部,而
remove
始终位于头部?添加和删除由同一线程完成。我不在乎在哪里补充。从尾部或头部移除。此线程可以获得删除元素id-x的请求,并且需要删除它。是否
add
始终位于尾部,而
remove
始终位于头部?添加和删除由同一线程完成。我不在乎在哪里补充。从尾部或头部移除。这个线程可以得到一个删除元素id-x的请求,它需要删除它。列表很大(100K),所以每个元素上都有计时器非常昂贵。列表很大(100K),所以每个元素上都有计时器非常昂贵。我喜欢这个概念,但它需要一个手工制作的结构来避免锁定。@MatthieuM.:这可能是一个自定义数据结构。@user1495181:谢谢你提供的信息,我更新了答案。基本上,只要列表和子列表是双链接列表,删除操作仍然是O(1)(前提是从id到进程有一个O(1)查找)。删除操作是按id进行的,因此需要在所有存在的子列表中搜索。我不明白为什么它是O(1)。我同意你的观点,这应该是设计,因为这样。在小名单上的清白工作和竞争机会很小。感谢you@user1495181:您可以使用哈希表(
std::unordered_map
)将id关联到子列表元素。我喜欢这个概念,但它需要一个手工制作的结构来避免锁定。@MatthieuM.:这可能是一个自定义数据结构。@user1495181:谢谢您提供的信息,我更新了答案。基本上,只要列表和子列表是双链接列表,删除操作仍然是O(1)(前提是从id到进程有一个O(1)查找)。删除操作是按id进行的,因此需要在所有存在的子列表中搜索。我不明白为什么它是O(1)。我同意你的观点,这应该是设计,因为这样。在小名单上的清白工作和竞争机会很小。感谢you@user