Господа, подскажите, существует ли в природе примитив синхронизации, паттерн или волшебный алгоритм, что бы засинхронизировать треды один раз, затем разойтись каждый сам по себе, а затем сойтись снова и закоммитить результат в том же порядке, в котором была первая синхронизация?
Т.е. для каждого треда хочется такого:
while(true) {
int id = get_seq_id(); # threadsafe, id монотонно возрастают
compute(); # runs in parallel
commit(id); # threadsafe, но в порядке возрастания id
cleanup()
}
Пока в голову пришло только, что можно было в `get_seq_id` возвращать promise и помещать future от него в очередь на другом конце которой сидел бы отдельный поток, который и делал бы commit. Вроде бы должно работать, но надо заморачиваться с возвращением результата коммита обратно в каждый тред, это выглядит переусложненным, да и дергать контексты просто чтобы записать в файл в нужном порядке (commit именно это и делает) не выглядит как нечто хорошее.
В общем, можно ли обойтись без дополнительных тредов и какое слово гуглить для этого?
Предпочтительно Java/Scala, но не так важно, т.к. если найдется решение в других языках, то идля Java/Scala что-то подобное тоже будет.
Спасибо.