Вы передали ссылку на i
при добавлении нового задания:
tasks.push_back( [&](){cout<< i<<endl;} );
// ^^^ here
Когда задание выполнено, i
достигло 20, так что каждый поток будет печатать.
Вместо этого вы, вероятно, захотите получить копию из i
:
tasks.push_back([=i]{ std::cout << i << '\n'; });
(=
здесь необязательный; я включил его, чтобы прояснить ситуацию)