Не делай этого.
Пожалуйста, научитесь понимать, как работает асинхронная обработка данных, и добавьте еще один обработчик завершения в parseData
. И вы неправильно используете DispatchGroup
в B
. Как следует из названия, это полезно только для группы асинхронных вызовов, например, в цикле
func parseData(from json: [String: Any], completion: @escaping (Val) -> Void) {
var a //some values I got from parsing that I NEED for B
var anotherVariable
B(a) { result in
anotherVariable = result
completion(Val(a, anotherVariable, anotherVariable[0]))
}
}
func B(_ a: a, completion: @escaping ([Res]) -> Void) {
var res = [Res]()
SomeotherFunc(a) { resp in
res = resp
completion(res)
})
}
Вы путаете два понятия - пишущий из нескольких потоков и пишущий из нескольких процессов.
В процессе ее возможное, чтобы гарантировать, что один вызов fprintf завершается, прежде чем следующему предоставляют доступ к буферу вывода, но после того как Ваше приложение качает тот вывод в файл, Вы во власти ОС. Без некоторого основанного на ОС механизма блокировки Вы наклоняетесь, гарантируют, что совершенно другое приложение не пишет в Ваш файл журнала.
Звуки мне как Вы должны читать на захвате файла. Проблема, которую Вы имеете, состоит в том, что несколько процессов (т.е. не потоки) пишут в тот же файл одновременно и нет никакого надежного способа обеспечить, чтобы записи были атомарными. Это может привести к файлам, перезаписывающим записи друг друга, смешанный вывод и в целом недетерминированное поведение.
Это не имеет никакого отношения к Потокобезопасности, поскольку это релевантно только в программах многопоточности единственного процесса.
Текущий стандарт C++ не говорит ничего полезного о параллелизме, ни делает 1990 C стандарт. (Я не считал 1999 C стандарт, так не может прокомментировать его; предстоящий C++ 0x стандарт действительно говорит вещи, но я не знаю точно что бесцеремонно.)
Это означает, что fprintf () сам вероятен ни ориентированный на многопотоковое исполнение, ни иначе, и что он зависел бы от реализации. Я считал точно, что glibc документация говорит об этом, и сравните его с точно, что Вы делаете.