Giả sử tôi đang bắt đầu std::thread
và sau detach()
đó, vì vậy luồng tiếp tục thực thi mặc dù cái std::thread
đã từng đại diện cho nó, đi ra khỏi phạm vi.
Giả sử thêm rằng chương trình không có giao thức đáng tin cậy để tham gia luồng tách rời 1 , do đó, luồng tách rời vẫn chạy khi main()
thoát.
Tôi không thể tìm thấy bất cứ điều gì trong tiêu chuẩn (chính xác hơn là trong bản nháp N3797 C ++ 14), trong đó mô tả những gì sẽ xảy ra, cả 1.10 và 30.3 đều không chứa từ ngữ thích hợp.
1 Một câu hỏi khác, có lẽ tương đương, là: "một chuỗi tách rời có thể được nối lại không", bởi vì bất kỳ giao thức nào bạn phát minh ra để tham gia, phần báo hiệu sẽ phải được thực hiện trong khi luồng vẫn đang chạy và bộ lập lịch của hệ điều hành có thể quyết định đặt luồng vào trạng thái ngủ trong một giờ ngay sau khi tín hiệu được thực hiện mà không có cách nào để đầu nhận nhận được phát hiện một cách đáng tin cậy rằng luồng thực sự kết thúc.
Nếu chạy ra main()
với các luồng tách rời đang chạy là hành vi không xác định, thì bất kỳ việc sử dụng nàostd::thread::detach()
là hành vi không xác định trừ khi luồng chính không bao giờ thoát 2 .
Vì vậy, chạy ra main()
với các luồng tách rời đang chạy phải có hiệu ứng xác định . Câu hỏi là: ở đâu (trong tiêu chuẩn C ++ , không phải POSIX, không phải tài liệu hệ điều hành, ...) là những hiệu ứng được xác định.
2 Một sợi chỉ tách rời không thể được nối (theo nghĩa std::thread::join()
). Bạn có thể đợi kết quả từ các luồng được tách ra (ví dụ: thông qua một tương lai từ std::packaged_task
hoặc bằng một semaphore đếm hoặc cờ và một biến điều kiện), nhưng điều đó không đảm bảo rằng luồng đã thực hiện xong . Thật vậy, trừ khi bạn đặt phần tín hiệu vào destructor của các đối tượng tự động đầu tiên của chủ đề, có sẽ , nói chung, là mã (destructor) mà chạy sau khi mã tín hiệu. Nếu HĐH lên lịch cho luồng chính để tiêu thụ kết quả và thoát ra trước khi luồng tách rời kết thúc chạy các hàm hủy nói trên, thì ^ Wis sẽ xác định điều gì sẽ xảy ra?
std::exit
hoặc thoát khỏimain
là đủ, nhưng không cần thiết, để đáp ứng các yêu cầu này." (toàn bộ đoạn có thể có liên quan) Cũng xem [support.start.term] / 8 (std::exit
được gọi khimain
trả về)