Вот мой код:
int main() {
std::cout << "Hello, World!" << std::endl;
std::vector<int> v{4,3,2,1,3,3,3,3,4,3,2,1,3,3,3,3};
std::mutex mtx;
int i2=2;
int i3=2;
for_each(std::execution::par,v.begin(),v.end(),[i2,i3](const int& date)mutable{
_sleep(1000);
i2++;
std::cout<<&i2<<std::endl;
std::cout<<i2<<std::endl;
});
return 0;
}
и результат:
0000001EF70FF540
0000001EF6FFF370
0000001EF6AFF240
0000001EF6EFF350
0000001EF71FF7E0
33
3
3
3
0000001EF72FFA70
3
0000001EF73FF7E0
3
0000001EF74FF6E0
3
0000001EF75FF8C0
3
0000001EF76FF9B0
3
0000001EF77FF5D0
3
0000001EF71FF7E0
3
0000001EF6AFF240
0000001EF70FF540
0000001EF6FFF370
0000001EF6EFF350
3
3
3
3
, как вы можете видеть , для каждого l oop, i2 получил новый скопируйте , и сделайте инкремент для этой копии. Итак, мы получаем 2 ++ ,, ответ равен 3.
Но когда я изменяю небольшую часть этого кода: измените
for_each(std::execution::par,v.begin(),v.end(),[i2,i3](const int& date)mutable{
на
for_each(std::execution::par,v.begin(),v.end(),[i2,&i3](const int& date)mutable{
, поскольку i2 всегда передается по значению, вывод должен оставаться неизменным. Но теперь вывод:
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
7
0000003ACCCFFB20
0000003ACCCFFB20
7
7
7
7
0000003ACCCFFB20
8
0000003ACCCFFB20
9
0000003ACCCFFB20
10
0000003ACCCFFB20
11
0000003ACCCFFB20
12
0000003ACCCFFB20
13
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
18
1818
18
18
Я проверил этот адрес, это действительно, одна копия исходной переменной i2. Но зачем копировать только один раз, а не несколько раз?