Ответ 1
Из этой измененной программы:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <thread>
#include <sstream>
int main()
{
int arr[10];
std::iota(std::begin(arr), std::end(arr), 1);
using itr_t = decltype(std::begin(arr));
// the function that will display each element
auto f = [] (itr_t first, itr_t last) {
std::stringstream ss;
ss << "**Pointer:" << first << " | " << last << std::endl;
std::cout << ss.str();
while (first != last) std::cout<<*(first++)<<' ';};
// we have 3 threads so we need to figure out the ranges for each thread to show
int increment = std::distance(std::begin(arr), std::end(arr)) / 3;
auto first = std::begin(arr);
auto to = first + increment;
auto last = std::end(arr);
std::thread threads[3] = {
std::thread{f, first, to},
#ifndef FIX
std::thread{f, (first = to), (to += increment)},
std::thread{f, (first = to), last} // go to last here to account for odd array sizes
#else
std::thread{f, to, to+increment},
std::thread{f, to+increment, last} // go to last here to account for odd array sizes
#endif
};
for (auto&& t : threads) {
t.join();
}
}
Я добавляю отпечатки указателя first
и last
для лямбда-функции f
и нахожу этот интересный результат (когда FIX
undefined):
**Pointer:0x28abd8 | 0x28abe4
1 2 3 **Pointer:0x28abf0 | 0x28abf0
**Pointer:0x28abf0 | 0x28ac00
7 8 9 10
Затем я добавлю код для случая #ELSE
для #ifndef FIX
. Он работает хорошо.
- Обновление: этот вывод, исходный пост ниже, неверен. Моя вина. См. Комментарий Джоша ниже -
Я считаю, что вторая строка
std::thread{f, (first = to), (to += increment)},
потоков [] содержит ошибку: присвоение внутри две пары круглых скобок, могут быть оценены в любом порядке, синтаксический анализатор. Тем не менее порядок присваивания 1-го, 2-го и 3-го аргументов конструктор должен сохранить порядок как указано.
--- Обновление: исправлено ---
Таким образом, вышеупомянутые результаты отладочной печати показывают, что GCC4.8.2 (моя версия) по-прежнему глючит (не сказать GCC4.7), но GCC 4.9.2 исправляет эту ошибку, поскольку сообщил Максим Егорушкин (см. комментарий выше).