通过c+的正确方式是什么+;使用boost::thread将对象从一个线程转移到另一个线程? 从一个线程到另一个线程,C++对象(映射、向量等)的正确方式是什么?我担心竞争条件、过时的值等。我正在使用boost线程

通过c+的正确方式是什么+;使用boost::thread将对象从一个线程转移到另一个线程? 从一个线程到另一个线程,C++对象(映射、向量等)的正确方式是什么?我担心竞争条件、过时的值等。我正在使用boost线程,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,提前谢谢 这完全取决于这个对象“做什么”。如果它是自包含的,即不包含指向原始线程中可能使用的其他对象的指针/引用,则似乎没有问题。如果OTOH it确实包含对原始线程中可能仍在使用的某些数据的引用,则应同步其访问 当然,应该避免通过值传递复杂对象。正确的方式通常是一个主观问题,尽管我想这取决于解释。简而言之,我希望接收线程“看到”对象已通过发送线程传递,因此不会发生重新排序问题或读取过时值导致的问题。请使用队列(无锁或正确锁定)。我希望避免使用队列,而是希望将对该对象的引用传递给另一个thera

提前谢谢

这完全取决于这个对象“做什么”。如果它是自包含的,即不包含指向原始线程中可能使用的其他对象的指针/引用,则似乎没有问题。如果OTOH it确实包含对原始线程中可能仍在使用的某些数据的引用,则应同步其访问


当然,应该避免通过值传递复杂对象。

正确的方式通常是一个主观问题,尽管我想这取决于解释。简而言之,我希望接收线程“看到”对象已通过发送线程传递,因此不会发生重新排序问题或读取过时值导致的问题。请使用队列(无锁或正确锁定)。我希望避免使用队列,而是希望将对该对象的引用传递给另一个therad。这是我使用的图书馆的限制。你打算如何“传递参考”?您不能让第二个线程神奇地意识到您希望它处理的对象的存在。第二个线程必须知道如何查找该对象,而第一个线程必须知道放置该对象的位置(即共享状态)——这意味着您无法避免在该共享状态上进行同步(如我所说,它可以无锁完成,但需要更大的努力。)最安全,最简单的选择是拥有一个锁定的队列,您可以将自包含的对象发布到该队列,第二个线程可以读取该队列……我什么也不做,它是一条由工作线程创建的消息,现在正从工作线程传递到“发送者”线程,以便将消息发送到某个对等线程。