【发布时间】:2018-07-06 13:11:53
【问题描述】:
当资源数量未知/变化时,我很难找到同步线程的方法。问题:
有一个资源数组 R 在多个线程之间共享,每个线程可以执行 3 种操作之一:
创建一个新资源并将其添加到数组中(从而增加它的大小)。
从数组中删除一个资源(从而减小它的大小)。
访问资源(写入/读取它的值)。
每个操作都会向用户输出成功/失败消息。每个资源都有一个唯一的 ID。目的是允许尽可能多的并行性,因此不能为每个线程操作锁定所有资源(整个数组)。
这样做的一个问题是,每次线程向数组添加新资源时,它也需要为该资源创建一个锁,这就产生了一个问题,即在创建线程创建锁之后,锁可以在创建线程有时间初始化创建的资源值之前被访问线程抓取。
另一个问题是线程试图访问不存在的资源的情况,因此在这种情况下,它会检查资源是否存在,如果不存在则向用户输出错误消息,但在输出错误消息之前另一个线程创建资源(在访问线程检查资源是否存在之后),因此将在成功消息(混合顺序)之后输出错误消息。
我想听听有关如何处理此类问题的想法。 谢谢。
【问题讨论】:
-
听起来你需要一个线程安全的向量。除非你只取 from 并添加到后面,否则你可以使用无锁队列。
-
我写了一个无锁、固定容量的向量,但是限制比你需要的要多(多个线程可以添加元素,单个线程可以遍历元素并在遍历时删除它们)。不过,如果你有兴趣,就在这里:github.com/OlivierSohn/cpp.algorithms/blob/master/include/…
标签: c++ multithreading synchronization locking