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