具有不断变化的资源量的 C++ 多线程同步

c++ multithreading synchronization with a changing amount of resources

本文关键字:资源量 C++ 多线程 同步 变化      更新时间:2023-10-16

当资源量未知/变化时,我在寻找同步线程的方法时遇到了一些麻烦。问题:

有许多线程之间共享的资源 R 数组,每个线程可以执行以下 3 个操作之一:

  1. 创建并向数组添加新资源(从而增加其大小(。

  2. 从数组中删除资源(从而减小其大小(。

  3. 访问资源(写入/读取其值(。

每个操作都会向用户输出成功/失败消息。 每个资源都有一个唯一的 ID。目的是允许尽可能多的并行性,因此锁定每个线程操作的所有资源(整个数组(不是一个选项。

这样做的一个问题是,每次线程向数组添加新资源时,它也需要为资源创建一个锁,这就产生了一个问题,即在创建线程创建锁之后,在创建线程有时间初始化创建的资源值之前,访问线程可以抓取锁。

另一个问题是线程尝试访问不存在的资源的情况,因此在这种情况下,它将检查资源是否存在,如果不存在,则向用户输出错误消息,但在输出错误消息之前,另一个线程创建资源(在访问线程检查资源是否存在之后(,因此错误消息将在成功消息(混合顺序(之后输出。

我想听听如何处理这类问题的想法。 谢谢。

首先,当您从多个线程更改数组时,该数组必须是线程安全的,因此请为整个数组保留一个锁,并在执行这三个操作中的任何一个时获取它。

这样做的一个问题是,每次线程向数组添加新资源时,它也需要为资源创建一个锁,这就产生了一个问题,即在创建线程创建锁之后,在创建线程有时间初始化创建的资源值之前,访问线程可以抓取锁。

对于此问题,请确保每个线程在向数组添加和初始化资源时锁定数组。 如果初始化过程是一项耗时的任务,请在将资源添加到数组之前执行可以异步完成的部分。 例如,如果要将对象添加到数组中,则需要花费大量时间来初始化, 并且可以异步初始化,首先创建并初始化该对象,然后锁定数组,同时将对象的指针添加到数组。

另一个问题是线程尝试访问不存在的资源的情况,因此在这种情况下,它将检查资源是否存在,如果不存在,则向用户输出错误消息

,但在输出错误消息之前,另一个线程创建资源(在访问线程检查资源是否存在之后(,因此不会输出必要的错误消息。

我不确定在这种情况下你想做什么,如果你想让线程等待资源的创建(如果它不存在(,请使用条件变量,并且每次添加到数组的资源唤醒等待线程再次检查资源。

如果您不希望线程等待添加资源,但您的问题只是输出"不存在"错误不正确,而资源在用户收到错误的那一刻存在,答案是:"没有问题! 在我们检查资源时,资源不存在,并报告了错误。

更新:

当您要同时访问多个资源时,您应该锁定数组以访问该资源,然后锁定资源,然后在保持资源锁的同时释放数组的锁,但是一旦线程想要删除资源,它必须获取该资源的锁以确保没有其他线程正在使用它。

这是一个标准的同步问题,只需使用 std::mutex(或 std::shared_mutex,如果可用且适当(控制对包含资源的 std::vector 的访问。 如果你做得对,在你把整体互斥锁释放到向量之前,没有什么可以抓住新的资源锁。