Trong một configure
tập lệnh điển hình được tạo bởi autotools, bạn có loại đoạn này:
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
Điều này hơi phức tạp, nhưng điều quan trọng đối với câu hỏi của tôi, đại khái là:
g++ -E conftest.cpp > conftest.i 2>&1
Bây giờ, đây không phải là đa luồng an toàn phải không?
Bản thân tôi đã thấy một thất bại, trong đó một quá trình Tạo với -j
tùy chọn sinh ra nhiều luồng, một trong các luồng đưa ra lỗi tiêu chuẩn một số đầu ra rác và một luồng khác, chạy configure
tập lệnh ở trên, sẽ đưa các lỗi từ luồng đầu tiên, vào conftest.i
. Tôi đoán điều này là do họ chia sẻ luồng 2 (lỗi tiêu chuẩn), được kế thừa từ quy trình cha.
Ai có lỗi:
Các autotools tạo
configure
tập lệnh, có lỗi vì chúng tạo mã không an toàn đa luồng? Nhưng điều kỳ lạ là một lỗi đơn giản như vậy sẽ xuất hiện trong một phần mềm trưởng thành như vậy.Liệu tập lệnh xây dựng sử dụng makefile sử dụng
configure
có lỗi không, trong đó nó sử dụngmake
với-jn
tùy chọn? Nhưng điều đó cũng lạ, bởi vì nhiều makefile sử dụngconfigure
các script và sẽ không hợp lý khi yêu cầu tất cả chúng phải chậm và không sử dụng-jn
.
Thất bại ở trên là có thật, tôi đã thấy nó. Tôi nghĩ rằng tôi hiểu cơ chế của sự thất bại. Điều tôi bối rối là, ai có lỗi?