在我的代码中,我有 2/4 个线程执行蒙特卡罗模拟。他们每个人都进行了许多实验,他们都将结果收集到一个 stl 向量中。我的问题是:假设每个线程依次运行 1000 个实验。是一次将结果存储到共享向量中,还是每隔一段时间存储一次更好?如果他们等到他们有一些一致的数据量,写入向量将需要更长的时间,所以我不确定第二个解决方案是否一定比第一个更好。
PS每个实验都是数值计算,所以没有IO操作。
谢谢
在我的代码中,我有 2/4 个线程执行蒙特卡罗模拟。他们每个人都进行了许多实验,他们都将结果收集到一个 stl 向量中。我的问题是:假设每个线程依次运行 1000 个实验。是一次将结果存储到共享向量中,还是每隔一段时间存储一次更好?如果他们等到他们有一些一致的数据量,写入向量将需要更长的时间,所以我不确定第二个解决方案是否一定比第一个更好。
PS每个实验都是数值计算,所以没有IO操作。
谢谢
如果您要等到计算完所有结果后再使用任何结果,请为向量中的 4,000 个结果预分配空间,并让每个线程写入向量中的一个元素范围。不需要锁定,因为没有两个线程访问向量中的相同元素。
如果要在计算结果时使用结果,请使用某种并发队列数据结构而不是向量。
如果您只在向量中放置 2000 到 4000 个元素,我怀疑这两种方式都会产生很大的不同。
做任何对算法最自然的事情。如果这还不够好,请考虑以另一种方式进行。
在考虑了一下之后,它可能同时满足两个目的(简单性和速度),让每个线程将结果存储到本地向量,然后将本地向量的内容复制到“全局”向量(受锁保护),当线程完成。当然,只要等待结果的任何东西都可以等到线程完全完成才能获得更新。
在这里,单链表可能是比向量更好的选择。
如果只有一个线程读取和一个线程写入fifo ..您不需要任何同步。诀窍是在列表中始终保留至少一个“虚拟”元素,如果 head == tail 则 fifo 为空。头和尾指针可以被操作来推送和弹出,这样就不需要同步了。
使用这个 .. 你可以制作几个 Q .. 这将不需要任何同步 如果新/删除需要时间 .. 你可以让 Q 来保存可重用的元素。
祝你好运。
记住 .. 正是一位读者,一位作家 .. 不多也不少。诀窍是创建很多这样的 Q,Q 也可以回收对象......而且你不需要任何线程同步的东西......
如果你的 Q 确实是空的 .. 只需要一个 sleep() / wakeup() 功能。
如果我还没有说过.. 正好是一位读者,也是一位作家。