C++ c++;多线程优化

C++ c++;多线程优化,c++,multithreading,stl,vector,montecarlo,C++,Multithreading,Stl,Vector,Montecarlo,在我的代码中,有2/4个线程执行montecarlo模拟。他们每个人都进行了大量的实验,并将结果收集到stl向量中。 我的问题是:假设每个线程按顺序运行1000个实验。将结果一次或每隔一段时间存储到共享向量中更好吗?如果他们等到拥有一定数量的数据,写入向量将花费更长的时间,因此我不确定第二个解决方案是否一定比第一个好 PS每个实验都是数值计算,所以没有IO操作 谢谢如果要等到所有结果都计算出来后再使用任何结果,请在向量中为4000个结果预先分配空间,并让每个线程写入向量中的一个元素范围。不需要锁

在我的代码中,有2/4个线程执行montecarlo模拟。他们每个人都进行了大量的实验,并将结果收集到stl向量中。 我的问题是:假设每个线程按顺序运行1000个实验。将结果一次或每隔一段时间存储到共享向量中更好吗?如果他们等到拥有一定数量的数据,写入向量将花费更长的时间,因此我不确定第二个解决方案是否一定比第一个好

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


谢谢

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


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

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


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

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

做算法中最自然的事情。如果这样做不够好,那就换一种方式做吧


仔细考虑一下,让每个线程将结果存储到一个局部向量,然后在线程完成时将局部向量的内容复制到“全局”向量(受锁保护),这可能有两个目的(简单性和速度)。当然,只要等待结果的任何东西都可以等到线程完全完成后再进行更新。

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

做算法中最自然的事情。如果这样做不够好,那就换一种方式做吧


仔细考虑一下,让每个线程将结果存储到一个局部向量,然后在线程完成时将局部向量的内容复制到“全局”向量(受锁保护),这可能有两个目的(简单性和速度)。当然,只要等待结果的任何东西都可以等到线程完全完成后再进行更新。

单链接列表可能比vector更好

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

用这个。。你可以做几个Q。。不需要任何同步 如果新建/删除需要时间。。您可以使用Q来保存可重用元素

祝你好运

记住。。一个读者,一个作家。。不多也不少。 诀窍是创建很多这样的Q,Q也可以循环使用对象。。和 你不需要任何线程同步的东西

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


万一我还没说。。只有一个读者,也只有一个作者。

在这里,单链接列表可能比向量更好

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

用这个。。你可以做几个Q。。不需要任何同步 如果新建/删除需要时间。。您可以使用Q来保存可重用元素

祝你好运

记住。。一个读者,一个作家。。不多也不少。 诀窍是创建很多这样的Q,Q也可以循环使用对象。。和 你不需要任何线程同步的东西

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


万一我还没说。。只有一个读卡器,只有一个写卡器。

您可以拥有一个共享的无锁堆栈,并将结果推送到该堆栈中。您可以拥有一个共享的无锁堆栈,并将结果推送到该堆栈中。对指针的访问仍然需要同步,可以使用锁或原子。一个链表可能会破坏性能;与其他序列容器相比,链表对于大多数用例来说效率非常低(当然,性能成本是否巨大完全取决于OP的用例。)@James。。不对指针的访问不需要同步。。这就是美。。从概念上考虑。。如果有一个长的单链接列表。。两个线程是否会更改相同的内存位置!即使只有一个线程正在修改指针,而另一个线程正在读取指针,对指针的访问也需要同步。如果将链表用作队列,这总是可能的,并且很可能出现在头节点和尾节点。@James请编写代码。。任何内存位置都不会同时有RW或WW…实际上,现在我很困惑。您建议将链表用作队列,但只有一个线程将修改该列表。如何从队列中删除元素?也许你可以证明你试图解释的是什么