C++ 为什么不';这些线程不是按顺序运行的吗?

C++ 为什么不';这些线程不是按顺序运行的吗?,c++,multithreading,c++11,C++,Multithreading,C++11,当我运行此代码时: #包括 #包括 #包括 std::互斥m; int main() { 病媒工作者; 对于(int i=0;i

当我运行此代码时:

#包括
#包括
#包括
std::互斥m;
int main()
{
病媒工作者;
对于(int i=0;i<10;++i)
{
工人们,回岗([i]
{
标准:锁和防护锁(m);

std::cout您的互斥实现的是没有两个线程同时打印。但是,它们仍然在争夺哪个线程首先获得互斥


如果您想进行串行执行,您可以完全避免线程。

这完全取决于调度线程的顺序的操作系统。您不能依赖任何顺序。假设它是完全随机的。

您正在将lambda传递回emplace_,它用作std::thread构造函数的参数。请参阅r从cppreference.com复制/粘贴以下内容

将新元素追加到容器的末尾。元素通过std::allocator_traits::construct构造,它通常使用placement new在容器提供的位置就地构造元素。参数args…作为std::forward(args)转发给构造函数

在std::thread对象完全构造并运行lambda主体定义的线程入口点之前,lambda主体中的互斥对象不会产生任何影响。某些std::threads可能会在循环期间开始运行,或者线程可能会在循环完成后才启动。您无法通过可移植的方式解决这一问题


在for循环在向量中构造所有std::线程之后,由操作系统决定线程的运行顺序,这就是如何获得输出的随机顺序。

执行顺序无关紧要,您无法预测它,并且在给定的运行中,它会随着时间的推移而不断变化

您的设计不应该以任何方式或形式依赖于线程执行顺序

更进一步的是:如果N个线程正在等待一个同步对象,比如说一个互斥体,并且互斥体被释放,那么无论它们的相对调度优先级如何,都无法可靠且可移植地预测下一个将唤醒并获取互斥体的等待线程


非确定性使多线程编程变得困难:-)

一次访问一个线程与启动顺序无关Mutex阻止其中两个线程同时运行该段代码。但为什么您希望有任何特定的顺序?“一次只能访问一个线程”这正是您所实现的。但是为什么您希望它以特定的顺序发生呢?@AndreyT我认为如果一个线程一次可以访问,那么第一个线程将在value
0
处获得
I
,第二个线程在value
1
,依此类推。workers[0]处的线程的I等于0。但它可能不会首先执行。