4

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

我的问题如下:有时一切正常,但更多时候我得到损坏的图像,因为像素的值改变符号或变得与它们应该的完全不同。这可能是对像素的线程读/写访问的问题,如果是这样,我应该使用什么来代替标准向量?我尝试使用互斥锁来确保只有一个线程读取或写入向量,但是这些读/写操作经常发生,如果我在每次操作时锁定向量,应用程序就会变得太慢。

4

3 回答 3

6

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

于 2012-06-21T13:39:43.610 回答
0

当你做多线程时,尽量隔离线程的范围。

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

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

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

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

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

于 2012-06-21T13:52:34.760 回答
0
  1. 使用轻量级锁。那是在 Windows 上使用“CriticalSection”。或者编写您自己的用户空间锁,例如在 TinyThread (http://tinythreadpp.bitsnbites.eu/) 中。这些是用 ASM 编写的,实际锁定和解锁的开销几乎为零。

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

于 2012-06-21T16:23:25.783 回答