Реализация glibc fprintf () ориентирована на многопотоковое исполнение?

Не делай этого.

Пожалуйста, научитесь понимать, как работает асинхронная обработка данных, и добавьте еще один обработчик завершения в 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)
    })
}
8
задан sashoalm 20 March 2014 в 16:20
поделиться

3 ответа

Вы путаете два понятия - пишущий из нескольких потоков и пишущий из нескольких процессов.

В процессе ее возможное, чтобы гарантировать, что один вызов fprintf завершается, прежде чем следующему предоставляют доступ к буферу вывода, но после того как Ваше приложение качает тот вывод в файл, Вы во власти ОС. Без некоторого основанного на ОС механизма блокировки Вы наклоняетесь, гарантируют, что совершенно другое приложение не пишет в Ваш файл журнала.

14
ответ дан 5 December 2019 в 07:13
поделиться

Звуки мне как Вы должны читать на захвате файла. Проблема, которую Вы имеете, состоит в том, что несколько процессов (т.е. не потоки) пишут в тот же файл одновременно и нет никакого надежного способа обеспечить, чтобы записи были атомарными. Это может привести к файлам, перезаписывающим записи друг друга, смешанный вывод и в целом недетерминированное поведение.

Это не имеет никакого отношения к Потокобезопасности, поскольку это релевантно только в программах многопоточности единственного процесса.

7
ответ дан 5 December 2019 в 07:13
поделиться

Текущий стандарт C++ не говорит ничего полезного о параллелизме, ни делает 1990 C стандарт. (Я не считал 1999 C стандарт, так не может прокомментировать его; предстоящий C++ 0x стандарт действительно говорит вещи, но я не знаю точно что бесцеремонно.)

Это означает, что fprintf () сам вероятен ни ориентированный на многопотоковое исполнение, ни иначе, и что он зависел бы от реализации. Я считал точно, что glibc документация говорит об этом, и сравните его с точно, что Вы делаете.

2
ответ дан 5 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: