Переносимое решение заключается в передаче собственных сгенерированных идентификаторов в поток.
int id = 0;
for(auto& work_item : all_work) {
std::async(std::launch::async, [id,&work_item]{ work_item(id); });
++id;
}
Тип std::thread::id
должен использоваться только для сравнения, а не для арифметики (то есть, как сказано в банке: идентификатор ).Даже его текстовое представление, создаваемое operator<<
, равно неопределено , поэтому нельзя полагаться на то, что оно является представлением числа.
Вы также можете использовать карту значений std::thread::id
на свой собственный идентификатор и поделитесь этой картой (с правильной синхронизацией) среди потоков, вместо прямой передачи идентификатора.