Выглядит как проблема с потоками.
Хотя я не уверен на 100%, следует отметить, что все 1000 потоков:
сделать ++i
с тем же значением int (это не атомарная операция - здесь могут возникнуть проблемы, вместо этого вы можете использовать __sync_fetch_and_add(&i,1)
(обратите внимание, что это расширение gcc не стандартное C ++);
сделать push_back
одновременно на std::vector
, который не является потокобезопасным контейнером AFAIK ... То же самое для cout
Я думаю. Я считаю, что вам нужно использовать механизм блокировки вокруг этого (std::mutex
возможно? Я до сих пор использовал только pthreads, но я считаю, что это то, что вам нужно).
Обратите внимание, что этот вид убивает любые преимущества использования потоков здесь, но это является следствием того факта, что вы не должны использовать несколько потоков одновременно для не поточно-безопасного объекта.
---- EDIT ----
У меня был Google на этом API потоков (к сожалению, его нет на моем tdm gcc 4.5 в Windows).
Вне зависимости от:
thread( bind(f, test) )
Вы можете просто сказать
thread( f, test )
и таким образом передать произвольное количество аргументов.
Источник: http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=422
Это также должно решить вашу проблему с копией вектора, который я раньше не замечал
(+1 для @villintehaspam здесь).
На самом деле, еще одна вещь необходима, чтобы убедиться, что копия здесь не создана:
thread( f, std::ref(test) )
убедится, что вектор не скопирован.
Ух ты, я тоже запутался. :)