Người ta nói rằng vòng lặp vô hạn for(;;);
là hành vi không xác định.Vòng lặp vô hạn vẫn chưa được xác định hành vi trong C++ nếu nó gọi thư viện được chia sẻ?
Từ http://en.cppreference.com/w/cpp/language/memory_model
Trong một chương trình hợp lệ C++, tất cả các chủ đề cuối cùng thực hiện một trong những sau:
- chấm dứt
- làm cho một cuộc gọi đến một I O thư viện/hàm
- đọc hoặc sửa đổi đối tượng dễ bay hơi
- thực hiện một hoạt động nguyên tử hoặc một hoạt động đồng bộ hóa
Không sợi thực hiện có thể thực hiện mãi mãi mà không thực hiện bất kỳ những hành vi quan sát được.
Lưu ý rằng nó có nghĩa là một chương trình với đệ quy vô tận hoặc vòng lặp vô hạn (cho dù được thực hiện dưới dạng tuyên bố hoặc theo vòng lặp hoặc nếu không) có hành vi không xác định.
Nhưng nếu nó gọi một hàm trong thư viện chia sẻ?
for(;;) sofunc();
Chức năng có thể làm bất kỳ loại blocking I/O, hoặc ném ngoại lệ.
Trong trường hợp này, trình biên dịch có giả định rằng vòng lặp có một số hành vi quan sát được không?
nếu 'sofunc' không thực hiện một trong các thao tác được chỉ định, bạn có chương trình không hợp lệ. – Jarod42
Tôi không biết bất kỳ trình biên dịch, hệ điều hành hoặc CPU nào gây ra bất kỳ sự cố nào bằng cách sử dụng vòng lặp kết thúc không trống hoặc vòng kết thúc không gọi hàm. ngoài thế giới chuẩn, câu hỏi này là vô lý. Tôi không có tuyên bố cho OP, tôi chỉ nghĩ rằng đây không phải là một vấn đề thực sự –
Nhưng không phải là CALL một hướng dẫn nguyên tử? – Logman