我在linux上使用g ++编译器(虚拟机上的ubuntu)。我在创建后正在调用std :: threads上的正确连接。这似乎立即开始,但一个接一个地完成。总运行时间是单线程时间的n倍。我没有看到pthreads的这个问题。 Pthreads完美缩放,运行时间是单线程时间的(1 / n)倍。
在Mac OS上观察到与clang ++编译器相同的行为。
是否有可能只在调用'join'时才运行std :: thread?我是否必须在std :: thread构造函数中传递任何其他参数以强制它们并行运行?搜索了c ++ 11文档,找不到任何明显的原因。
感谢任何帮助。
答案 0 :(得分:0)
这个问题有点不清楚。但要回答你的问题。是的,您的线程可能在被称为join时运行。但这不太可能。
当线程执行完成时,join()的函数返回。如果函数A()在单独的线程中启动函数B(),并且在函数A()中加入线程,则A()的执行将在连接点停止,直到B()完成执行。
根据http://www.cplusplus.com/reference/thread/thread/join/
该函数在线程执行完成时返回。 这会使此函数返回的时刻与线程中所有操作的完成同步:这会阻止调用此函数的线程的执行,直到构造调用的函数返回(如果还没有)。
另一个建议是检查这是否会分离流程并检查您的结果是否更快。这将帮助您识别问题,即join()是否导致问题。