multithread vector
我正在研究一个C++项目,它使用自创建的地图来存储数据——在这个意义上,地图更像是一个"地理"地图,一个图像。有不同的线程读和写。地图的数据存储在整数向量的标准向量中。它的大小不会改变,只会通过getter和setter函数改变某些像素的内容。
我的问题是:有时候一切都很好,但更经常的是我会收到损坏的图像,从某种意义上说,一个像素的值改变了符号或者变得完全不同于它们应该是什么。这可能是对像素的线程读/写访问的问题吗?如果是,我应该使用什么来代替标准向量?我尝试使用互斥来确保只有一个线程读取或写入向量,但是这些读取/写入操作经常发生,如果在每次操作时锁定向量,应用程序就会变得太慢。
你需要某种锁。为了防止这对您的性能造成太大的伤害,您应该尽量使锁的范围尽可能小。例如,可以锁定单独的行向量,这样不同行上的写入就不会相互干扰。哪种解决方案最适合您,取决于您的访问模式和平台。
使用轻质锁。在Windows上使用"CriticalSection"。或者编写自己的用户空间锁,例如在tinythread中(http://tinythreadp.bitsnites.eu/)。它们是用asm编写的,并且应该具有几乎零的开销来实际锁定和解锁。
一旦你确定锁本身是快的,如果事情仍然运行缓慢,那是因为你有锁争用。例如,多个线程都需要锁定同一个资源。在您的使用案例中,考虑一些类似于"读/写"互斥的东西。这是一个具有读互斥体和写互斥体的类。互斥体上的"readlock"方法只会锁定几个周期,以增加互斥体上的引用计数。readunlock"会减少引用计数。"writelock"锁定读取互斥体,并设置一个标志,防止读卡器锁定读取互斥体。然后锁定写互斥体并执行写操作。因此,您保证一次只能执行一个写入操作,并且在写入期间不会发生任何读取。但允许同时读取。
当您进行多线程处理时,尽量隔离线程的范围。
考虑并举例说明。想象一下你有一堵墙,你想让它涂上黑白条纹。为了加快工作速度,你决定雇用两名雇员。
现在,您可以用两种方式分配这个工作。1。把黑条画给一个工人,白条画给另一个工人。2。将墙分为两个分区,将左分区分配给一个工人,将右分区分配给第二个工人。
现在哪一个可能产生更好的性能?
在一般情况下,第二种情况更好,因为工人的工作区域是分开的,一个不需要等待另一个做他的工作。当然,第一种方法是正确的,但是,有可能一个工人在某个地方画画,第二个人也可能到达同一个地方,必须等待第一个完成。现在想象一下,如果你有10个工人,每个人只画一种特定的颜色,会发生什么。
多线程编程类似。如果您能够以更好的方式分区问题数据,那么您就可以使线程有效地工作。