В типичном скрипте 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 (стандартная ошибка), унаследованный от родительского процесса.

Кто виноват

  1. У автоинструментов, которые генерируют скрипт configure , есть ошибка, потому что они генерируют код, который не является многопоточным безопасным? Но странно, что такая простая ошибка будет присутствовать в таком зрелом программном обеспечении.

  2. Есть ли в скрипте сборки, использующем make-файл, который использует configure , ошибка в том, что он использует параметр make with -jn ? Но это также странно, потому что многие make-файлы используют скрипты configure и было бы неразумно требовать, чтобы все они работали медленно и не использовали -jn .

Вышеуказанная ошибка реальна, я видел это. Я думаю, что я понимаю механизм отказа. Что меня смущает, так это у кого ошибка?

0