1

在我的代码中,我有 2/4 个线程执行蒙特卡罗模拟。他们每个人都进行了许多实验,他们都将结果收集到一个 stl 向量中。我的问题是:假设每个线程依次运行 1000 个实验。是一次将结果存储到共享向量中,还是每隔一段时间存储一次更好?如果他们等到他们有一些一致的数据量,写入向量将需要更长的时间,所以我不确定第二个解决方案是否一定比第一个更好。

PS每个实验都是数值计算,所以没有IO操作。

谢谢

4

3 回答 3

8

如果您要等到计算完所有结果后再使用任何结果,请为向量中的 4,000 个结果预分配空间,并让每个线程写入向量中的一个元素范围。不需要锁定,因为没有两个线程访问向量中的相同元素。

如果要在计算结果时使用结果,请使用某种并发队列数据结构而不是向量。

于 2011-01-19T05:05:53.530 回答
2

如果您只在向量中放置 2000 到 4000 个元素,我怀疑这两种方式都会产生很大的不同。

做任何对算法最自然的事情。如果这还不够好,请考虑以另一种方式进行。

在考虑了一下之后,它可能同时满足两个目的(简单性和速度),让每个线程将结果存储到本地向量,然后将本地向量的内容复制到“全局”向量(受锁保护),当线程完成。当然,只要等待结果的任何东西都可以等到线程完全完成才能获得更新。

于 2011-01-19T05:06:51.107 回答
0

在这里,单链表可能是比向量更好的选择。

如果只有一个线程读取和一个线程写入fifo ..您不需要任何同步。诀窍是在列表中始终保留至少一个“虚拟”元素,如果 head == tail 则 fifo 为空。头和尾指针可以被操作来推送和弹出,这样就不需要同步了。

使用这个 .. 你可以制作几个 Q .. 这将不需要任何同步 如果新/删除需要时间 .. 你可以让 Q 来保存可重用的元素。

祝你好运。

记住 .. 正是一位读者,一位作家 .. 不多也不少。诀窍是创建很多这样的 Q,Q 也可以回收对象......而且你不需要任何线程同步的东西......

如果你的 Q 确实是空的 .. 只需要一个 sleep() / wakeup() 功能。

如果我还没有说过.. 正好是一位读者,也是一位作家。

于 2011-01-19T05:41:39.653 回答