多线程向量

multithread vector

本文关键字:向量 多线程      更新时间:2023-10-16

我正在C++从事一个使用自行创建的地图来存储数据的项目 - 从这个意义上说,地图更像是"地理"地图,所以是图像。有不同的线程读取和写入它。地图的数据存储在整数向量的 std 向量中。它的大小不会改变,只有某些像素的内容通过getter和setter功能改变。

我的问题如下:有时一切正常,但更多时候我得到损坏的图像,从某种意义上说,像素的值会发生变化或变得与它们应该完全不同。这可能是对像素的线程读/写访问的问题,如果是这样,我应该使用什么而不是标准向量?我尝试使用互斥锁来确保只有一个线程读取或写入矢量,但是这些读/写操作发生得如此频繁,以至于如果我在每个操作中锁定矢量,应用程序就会变得太慢。

您将需要某种锁定。为了防止这严重损害您的性能,您应该尝试使锁的范围尽可能小。例如,您可以锁定单个行向量,以便不同行上的写入不会相互干扰。哪种解决方案最适合您取决于您的访问模式和平台。

执行多线程处理时,请尝试尽可能隔离线程的作用域。

考虑和示例。想象一下,你有一堵墙,你想用黑白条纹涂上它。为了加快工作速度,您决定雇用两名员工。

现在,您可以通过两种方式分配此作业。1. 将黑色条纹的绘画分配给一名工人,将白色条纹分配给另一名工人。2. 将墙分成两个分区,将左侧分区分配给一个工人,将右侧部分分配给第二个工人

现在哪一个可能会产生更好的性能?

在一般情况下,第2种情况更好,因为工人的工作区域是分开的,一个人不需要等待另一个人来完成他的工作。当然,第一种方法没有错,但是,有可能一个工人在某个地方画画,第二个人也可能到达同一个地方,必须等待第一个完成。现在想象一下,如果你有10个工人,每个人只涂一种特定的颜色,会发生什么。

多线程编程与此类似。如果能够以更好的方式对问题数据进行分区,则可以使线程有效地工作。

  1. 使用轻量级锁。那是在Windows上使用"关键部分"。或者编写自己的用户空间锁,例如在TinyThread(http://tinythreadpp.bitsnbites.eu/)中。这些是用 ASM 编写的,实际锁定和解锁的开销应该几乎为零。

  2. 一旦你确定锁本身是快速的,如果事情仍然运行缓慢,那是因为你有锁争用。 例如,多个线程都需要锁定相同的资源。在您的用例中,请考虑类似"读/写"互斥锁的东西。这是一个具有读互斥锁和写互斥锁的类。互斥锁上的"readLock"方法仅锁定几个周期,以增加互斥锁上的引用计数。"readUnlock"确实会减少引用计数。"writeLock"锁定读互斥锁,并设置一个标志,防止读取器锁定读互斥锁。然后锁定写互斥锁并执行写操作。因此,您可以保证一次只能执行一个写入操作,并且在写入过程中不会发生任何读取操作。但允许同时读取。