多线程程序(C++)打印{0,1,2,3}的排列

Rad*_*oga 4 c++ multithreading permutation c++11

我希望打印由C++ 11编写的多线程程序设置的{0,1,2,3}的排列.

源代码是这样的:

#include <iostream>
#include <stdio.h>
#include <thread>
#include <vector>
#include <chrono>

using namespace std;


void func(int index);

int main()
{
    vector<thread> threads;

    for (int i = 0; i < 4; i++)
    {
        auto var = [&]()
        {
            return func(i);
        };

        threads.push_back(thread(var));
    }

    for (auto& thread : threads)
        thread.join();
}

void func(int index)
{
    cout << index;

    for (int i = 0; i < 10000; i++);
}
Run Code Online (Sandbox Code Playgroud)

我期望在输出中输入0123,但我收到奇怪的结果,如下:

0223

0133

0124

我不明白这种奇怪的行为,特别是我无法解释4号的存在.

可能这是初学者的错误,我感谢大家都会帮助我.

Sam*_*hik 5

i通过参考捕获:

    auto var = [&]()
    {
        return func(i);
    };
Run Code Online (Sandbox Code Playgroud)

因此,当最终启动的线程被启动并开始时,它没有实际的副本,此时i它具有的值,但它只有一个引用i.

现在可能会增加一倍或两倍.如果你认为引用实际上只是一个普通的指针,上面有一层薄薄的化妆,你应该能够自己解决这个问题.线程得到一个指针i,在线程开始运行时,谁知道它可以增加多少次.

而且,从技术上讲,因为i在这里甚至可能超出范围,如果for循环在线程开始执行之前终止,这是未定义的行为.