2010-10-14 32 views
8

Và điều gì sẽ xảy ra khi tôi cố gắng đẻ trứng quá nhiều?Có bao nhiêu chủ đề tôi có thể sinh ra bằng cách sử dụng tăng C++?

Tôi nhận được lỗi sau khi tôi đẻ trứng nhiều hơn khoảng 900 đề:

terminate called after throwing an instance of 'dining 1 
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> 
>dining 3 
' 
dining 2 
    what(): dining 4 
boost::thread_resource_errordining 3 

Đây có phải là lỗi dự kiến ​​phát sinh từ cố gắng để đẻ trứng quá nhiều chủ đề?

+0

Có thể giới hạn hệ điều hành. Kiểm tra với hướng dẫn sử dụng hệ thống của bạn. –

+1

Chỉ cần quan tâm, 900 chủ đề cho là gì? –

+0

@Mark: trông giống như phiên bản 900 thread của Philosophers Ăn uống. –

Trả lời

9

Hãy nhớ rằng mỗi chuỗi cần phải đặt trước dung lượng ngăn xếp. Đó là lý do tại sao có giới hạn về số lượng chủ đề bạn có thể sinh ra. Có vẻ như bạn đang đạt tới giới hạn này hoặc tăng cường sẽ khiến bạn không thể đạt đến giới hạn này.

Dưới đây là một liên kết đến tài liệu tăng gần đây nhất mà tài liệu hành vi mà bạn đang nhìn thấy (ném ngoại lệ): boost thread docs (tìm kiếm boost :: thread_resource_error trên trang đó)

4

Có bao nhiêu bạn có thể đẻ trứng tùy thuộc vào các hạn chế của môi trường hoạt động của bạn. Và có, boost::thread_resource_error là những gì bạn nên mong đợi khi không thể nhận được tài nguyên luồng thích hợp cần thiết, per the documentation

+1

tình cờ, tôi có một câu hỏi ngu ngốc. Khoảng bao nhiêu nó sẽ có trong Windows? Khoảng 10? 50? 100? 1000? 10000? –

+0

Tất cả đều phụ thuộc rất nhiều vào nhiều thứ. Bạn có bao nhiêu bộ nhớ, nếu có bất kỳ ràng buộc mức hệ điều hành nào, vv Câu trả lời chung sẽ là "có thể ít nhất là 1 (nhưng bạn phải kiểm tra) và có thể nhiều hơn" –

+0

Tôi sẽ đặt nó theo cách khác .Có thực tế để có 10K đưa ra đề tài trong các cửa sổ trong một quá trình duy nhất? –

0

Có hoạt động giới hạn của hệ thống. Nó chủ yếu sẽ đi xuống bao nhiêu bộ nhớ bạn có trên hệ thống của bạn. Nếu tôi nhớ lại chính xác từng chuỗi pthread được cấp tối thiểu 32 MB bộ nhớ. Mặc định là nhiều hơn nữa.

1

Bạn đang đạt đến giới hạn cứng. Như những người khác đã nói có thể có hai hạn chế:

  • số lượng đề một quá trình có thể đẻ trứng được giới hạn bởi hệ điều hành (hoặc trên toàn cầu hoặc mỗi quá trình)
  • bộ nhớ có sẵn bị hạn chế và mỗi thread dành riêng của mình ngăn xếp (thường là một vài MB và 4 MB * 900 -> 3.6 Đi)

Ngẫu nhiên, đây là điều thú vị về thói quen của Google Go. Thay vì sinh ra càng nhiều luồng càng tốt, thời gian chạy Go sẽ điều chỉnh số lượng các luồng cho số lõi có sẵn, và ghép các thủ tục theo cách thủ công trên các luồng vật lý này.

Hơn nữa, các thói quen có trọng lượng nhẹ (chỉ đặt trước 4 KB) vì chúng không sử dụng ngăn xếp truyền thống (biến mất của Stack Overflow!), Nghĩa là bạn có thể mở rộng hàng nghìn thao tác trên một máy điển hình nó sẽ không tốn nhiều tiền cho bạn.

Nếu bạn muốn thử nghiệm với xử lý song song cực:

  • tìm cách để giảm không gian stack giao cho mỗi thread (hãy cẩn thận của Stack Overflow)
  • switch to Go, hoặc tìm một ngôn ngữ khác thực hiện thói quen
Các vấn đề liên quan