В типичном скрипте configure
сгенерированном autotools, у вас есть такой фрагмент:
eval "$ac_cpp conftest.$ac_ext") 2>&5 |
tr -d '\r' |
$SED -n -e "/^boost_lib_version = /{s///;s/\"//g;p;q;}" >conftest.i 2>&1
Это несколько сложно, но что важно для моего вопроса, примерно:
g++ -E conftest.cpp > conftest.i 2>&1
Теперь, это не многопоточный сейф, не так ли?
Я сам видел сбой, когда процесс Make с опцией -j
порождает несколько потоков, один из потоков выводит на стандартный вывод ошибки, а другой поток, выполняющий скрипт configure
выше, будет помещать ошибки из первого поток, в conftest.i
. Я предполагаю, что это потому, что они разделяют поток 2 (стандартная ошибка), унаследованный от родительского процесса.
Кто виноват
У автоинструментов, которые генерируют скрипт
configure
, есть ошибка, потому что они генерируют код, который не является многопоточным безопасным? Но странно, что такая простая ошибка будет присутствовать в таком зрелом программном обеспечении.Есть ли в скрипте сборки, использующем make-файл, который использует
configure
, ошибка в том, что он использует параметрmake
with-jn
? Но это также странно, потому что многие make-файлы используют скриптыconfigure
и было бы неразумно требовать, чтобы все они работали медленно и не использовали-jn
.
Вышеуказанная ошибка реальна, я видел это. Я думаю, что я понимаю механизм отказа. Что меня смущает, так это у кого ошибка?