2011-01-12 43 views
20

Tôi đã thực hiện một số chương trình đa luồng trong Visual studio C++ bằng cách sử dụng các cuộc gọi beginthreadex, endthreadex.Làm chủ đề con thoát khi chuỗi gốc chấm dứt

Tôi tạo chuỗi chủ đề con1. Các chủ đề con chạy trên một chức năng mà không bao giờ thoát vì nó có một vòng lặp vô hạn. Bây giờ nếu chuỗi chủ đề chấm dứt với lỗi hoặc kết thúc thành công, thì luồng con cũng thoát chưa? Nghi ngờ của tôi là - có bất kỳ tình huống nào mà chủ đề con vẫn còn sống sau khi thoát khỏi chương trình chính không?

Đối với Linux, trường hợp này nên như thế nào?

+1

Đây là câu hỏi có liên quan chặt chẽ: http://stackoverflow.com/questions/2197699/is-it-necessary-to-explicitly-stop-all-threads-prior-to-exiting-a-win32-applicati – sharptooth

+0

bài đăng có câu trả lời xung đột. – excray

+0

@ user97642 Xung đột từ quan điểm của bạn là gì? Các câu trả lời dường như giống tôi. –

Trả lời

31

Không có mối quan hệ cha/con giữa các chuỗi. Nếu luồng A tạo chuỗi B và sau đó luồng A chấm dứt, thì luồng B sẽ tiếp tục thực thi.

Trường hợp ngoại lệ là khi chủ đề chính (có nghĩa là, luồng chạy chức năng main()) chấm dứt. Khi điều này xảy ra, quá trình chấm dứt và tất cả các chủ đề khác dừng lại.

+5

Hai trường hợp ngoại lệ. Nếu * any * thread gọi 'exit', thì * all * threads kết thúc. – EML

+1

Tôi cũng muốn thêm rằng nếu 'main' tồn tại mà không gọi' detach' trên luồng đang chạy, bạn sẽ có một ngoại lệ được ném. – Everyone

7

Vì C và C++ mandate that returning from the main function kills all running threads, vâng, quá trình này sẽ biến mất. Và vì hành vi đó được thực hiện bởi thời gian chạy, tình huống phải giống nhau trên Linux.

+0

Liên kết bạn cung cấp không nói bất cứ điều gì về yêu cầu ngôn ngữ của * giết chết * (!) Tất cả các chủ đề. Nó chỉ trích dẫn một yêu cầu trở về từ main tương đương với gọi exit(). –

2

Ngay sau khi quá trình chết của bạn, tất cả các nguồn lực đang được phát hành (bộ nhớ, tập tin và chủ đề)

Các cách chính xác để làm điều này: khi bạn gọi BeginThread, giữ tay cầm quay trở lại vào thread phụ huynh, và hãy gọi WaitForObject trước khi bạn rời khỏi chương trình (chúng tôi tham gia chuỗi chủ đề có chuỗi con).

Chuỗi chủ đề sẽ chặn cho đến khi kết thúc chuỗi con. Nếu chuỗi con của bạn có vòng lặp vô hạn, bạn có thể xác định "điểm gián đoạn" và kiểm tra xem bạn có nên thoát không. Ví dụ, sử dụng một biến boolean chia sẻ. Kiểm tra Interrupt Politely để biết thêm thông tin.

+0

Trường hợp của bạn là tốt khi chương trình bình thường chấm dứt, đó là nó đạt đến cuối của chính(). Nhưng có nhiều vị trí trong chuỗi chính hoặc chuỗi phụ huynh gọi exit(). Vì vậy, sẽ thoát() giết tất cả các chủ đề? – excray

+0

@ user97642 Nếu thoát khỏi chủ đề chính thì tất cả các chủ đề khác dừng lại –

+2

Hãy lưu ý rằng vô hạn chờ đợi trên semaphores, xử lý vv có thể gây ra quá trình của bạn để trở thành một zombie trong cả Windows và Linux. Nếu không nó giống như những người khác nói; khi chủ đề chính chết, tất cả những người khác đều bị giết. – JimR

Các vấn đề liên quan