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号的存在.
可能这是初学者的错误,我感谢大家都会帮助我.
您i通过参考捕获:
auto var = [&]()
{
return func(i);
};
Run Code Online (Sandbox Code Playgroud)
因此,当最终启动的线程被启动并开始时,它没有实际的副本,此时i它具有的值,但它只有一个引用i.
现在可能会增加一倍或两倍.如果你认为引用实际上只是一个普通的指针,上面有一层薄薄的化妆,你应该能够自己解决这个问题.线程得到一个指针i,在线程开始运行时,谁知道它可以增加多少次.
而且,从技术上讲,因为i在这里甚至可能超出范围,如果for循环在线程开始执行之前终止,这是未定义的行为.