多线程向量
multithread vector
我正在C++从事一个使用自行创建的地图来存储数据的项目 - 从这个意义上说,地图更像是"地理"地图,所以是图像。有不同的线程读取和写入它。地图的数据存储在整数向量的 std 向量中。它的大小不会改变,只有某些像素的内容通过getter和setter功能改变。
我的问题如下:有时一切正常,但更多时候我得到损坏的图像,从某种意义上说,像素的值会发生变化或变得与它们应该完全不同。这可能是对像素的线程读/写访问的问题,如果是这样,我应该使用什么而不是标准向量?我尝试使用互斥锁来确保只有一个线程读取或写入矢量,但是这些读/写操作发生得如此频繁,以至于如果我在每个操作中锁定矢量,应用程序就会变得太慢。
您将需要某种锁定。为了防止这严重损害您的性能,您应该尝试使锁的范围尽可能小。例如,您可以锁定单个行向量,以便不同行上的写入不会相互干扰。哪种解决方案最适合您取决于您的访问模式和平台。
执行多线程处理时,请尝试尽可能隔离线程的作用域。
考虑和示例。想象一下,你有一堵墙,你想用黑白条纹涂上它。为了加快工作速度,您决定雇用两名员工。
现在,您可以通过两种方式分配此作业。1. 将黑色条纹的绘画分配给一名工人,将白色条纹分配给另一名工人。2. 将墙分成两个分区,将左侧分区分配给一个工人,将右侧部分分配给第二个工人
现在哪一个可能会产生更好的性能?
在一般情况下,第2种情况更好,因为工人的工作区域是分开的,一个人不需要等待另一个人来完成他的工作。当然,第一种方法没有错,但是,有可能一个工人在某个地方画画,第二个人也可能到达同一个地方,必须等待第一个完成。现在想象一下,如果你有10个工人,每个人只涂一种特定的颜色,会发生什么。
多线程编程与此类似。如果能够以更好的方式对问题数据进行分区,则可以使线程有效地工作。
-
使用轻量级锁。那是在Windows上使用"关键部分"。或者编写自己的用户空间锁,例如在TinyThread(http://tinythreadpp.bitsnbites.eu/)中。这些是用 ASM 编写的,实际锁定和解锁的开销应该几乎为零。
-
一旦你确定锁本身是快速的,如果事情仍然运行缓慢,那是因为你有锁争用。 例如,多个线程都需要锁定相同的资源。在您的用例中,请考虑类似"读/写"互斥锁的东西。这是一个具有读互斥锁和写互斥锁的类。互斥锁上的"readLock"方法仅锁定几个周期,以增加互斥锁上的引用计数。"readUnlock"确实会减少引用计数。"writeLock"锁定读互斥锁,并设置一个标志,防止读取器锁定读互斥锁。然后锁定写互斥锁并执行写操作。因此,您可以保证一次只能执行一个写入操作,并且在写入过程中不会发生任何读取操作。但允许同时读取。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- 在多线程中添加到向量
- 在多线程中初始化向量
- 提升多线程向量的返回值
- 多线程向量
- c++多线程和进程中的向量
- 多线程无锁应用程序中具有多个迭代器的一个向量