资源变化量的C ++多线程同步

时间:2018-07-06 13:11:53

标签: c++ multithreading synchronization locking

当资源量未知/正在更改时,我很难找到一种同步线程的方法。问题:

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

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

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

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

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

一个问题是,每当线程将新资源添加到数组时,它也需要为该资源创建一个锁,这会产生一个问题,即在创建线程创建锁之后,锁可以在创建线程有时间初始化创建的资源值之前被访问线程抓住。

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

我想听听有关如何处理此类问题的想法。 谢谢。

2 个答案:

答案 0 :(得分:0)

这是一个标准的同步问题,只需使用std :: mutex(或std :: shared_mutex,如果可用并适当)控制对包含您资源的std :: vector的访问。如果操作正确,则在释放矢量的整个互斥锁之前,没有任何东西可以抓住新的资源锁。

答案 1 :(得分:0)

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

  

一个问题是,每当线程将新资源添加到数组时,它也需要为该资源创建一个锁,这会产生一个问题,即在创建线程创建锁之后,锁可以在创建线程有时间初始化创建的资源值之前被访问线程抓住。

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

  

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

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

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

更新:

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