2009-01-27 35 views

Trả lời

32

Trước tiên tôi xin khuyên đọc bài viết này: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

sau đó http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx

Để tóm tắt, giới hạn là bình thường ngăn xếp không gian (mà phải nằm trong khối tiếp giáp) và vì mỗi chủ đề tiêu thụ rải rác này về bạn nhanh chóng chạy ra khỏi các khối liền kề. Trên các máy và hệ điều hành 64 bit, vấn đề này ít hơn nhiều.

chiến lược giảm nhẹ tồn tại nhưng sẽ chỉ đi xa (và dựa vào bạn không sử dụng nhiều ngăn xếp cho mỗi thread)

Là một hướng dẫn sơ bộ:

  • tạo hàng chục là gần như chắc chắn để làm việc
  • hàng trăm có thể xảy ra trên máy chủ hiện tại và phần cứng máy tính để bàn nhưng rủi ro
  • hàng nghìn người gần như chắc chắn sẽ không thành công.

Bạn có thể không cần phải tạo ra hơn mười anyway (và nếu bạn thực sự làm cần bạn nên biết những thông tin này đã được)

+0

Tạo chúng sớm và gộp chúng lại để sử dụng sau này khi bộ nhớ không bị phân mảnh cũng sẽ hữu ích. –

0

Tôi đoán nó không phải là số lượng chủ đề, nhưng việc sử dụng bộ nhớ là yếu tố hạn chế.

1

Theo như tôi hiểu được mô hình toàn bộ luồng nó nên không thay đổi nhiều kể từ Win2K.

Không có giới hạn chủ đề thực sự nào, nhưng giới hạn của quy trình ngăn xếp không gian. Xem in-depth explanation of threading limits từ Raymond Chen để biết thêm chi tiết về điều này.

+0

Bingo! "Nhưng câu hỏi thực sự được nêu ra bất cứ khi nào ai đó hỏi," Số lượng chủ đề tối đa mà một quy trình có thể tạo ra là gì? "Là" Tại sao bạn tạo ra quá nhiều luồng mà thậm chí trở thành vấn đề? "" – TheSoftwareJedi

21

Câu trả lời tốt nhất mà tôi đã từng nghe khi đặt câu hỏi như vậy là:

Nó không quan trọng, và nếu bạn thấy rằng nó không thành vấn đề, bạn cần phải suy nghĩ lại những gì bạn đang làm để nó không quan trọng.

+5

Bravo, chủ đề trở nên tự đánh bại (và không hiệu quả) khi có hàng trăm các buggers nhỏ trôi nổi xung quanh. Sử dụng một hồ bơi thread và bạn sẽ không phải lo lắng. – paxdiablo

+1

+1 cho nhận xét. Làm cho ngày của tôi. Và khi nói đến luồng, nó chắc chắn đúng. –

+0

Tôi sẽ chạy Windows trên Knights Landing. Vì vậy, nó bây giờ làm rất nhiều vấn đề với 256-288 chủ đề – user1649948

12

Lưu ý rằng bạn nên kiểm tra kỹ thiết kế của mình nếu bạn lo ngại về việc đạt đến giới hạn này !!!!!!!!

Câu trả lời cho "Câu hỏi quan trọng hơn" của bạn về những gì xảy ra là OutOfMemoryException.

Không chính xác câu trả lời trực tiếp, nhưng dưới đây là một số mã để tìm hiểu giới hạn. Nó có thể có sẵn bộ nhớ phụ thuộc mặc dù. Sẽ quan tâm đến việc xem các kết quả hệ điều hành/CPU/mem khác.

cảm thấy tự do để chỉnh sửa và thêm máy tính của bạn trong:

  • Windows 7, VS2008, lõi kép, 2GB mem: 1.465 sau đó sụp đổ với OutOfMemoryException

    int i = 0; 
        try 
        { 
         while (true) 
         { 
          new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start(); 
          i++; 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(i); 
         Console.WriteLine(ex.ToString()); 
        } 
    
+0

+1 trên "nếu bạn có yêu cầu sau đó bạn đang làm một cái gì đó sai" tình cảm! –

+0

Tại sao cộng đồng bạn lại sử dụng wiki này? Đó là một câu trả lời hay (tôi đã +1 bạn); bạn sẽ nhận được tín dụng cho nó. –

+0

Wiki cộng đồng vì tôi không quan tâm đến nội dung đại diện và giúp người khác thêm kết quả của họ dễ dàng hơn. – TheSoftwareJedi

1

Đỗ đọc Bài đăng trên blog Raymond Chen mà ShuggyCoUk's answer chỉ vào.

Nhưng đặc biệt chú ý chút này: "số lượng tối đa đề rằng một quá trình có thể tạo ra là gì"

Nhưng câu hỏi thực sự mà được nâng lên bất cứ khi nào ai đó hỏi, là "Tại sao bạn tạo ra quá nhiều chủ đề mà điều này thậm chí còn trở thành một vấn đề?"

Mô hình "một chủ đề trên mỗi khách hàng" nổi tiếng là không vượt quá một chục khách hàng. Nếu bạn định xử lý nhiều hơn nhiều khách hàng cùng một lúc, bạn nên chuyển sang một mô hình thay vì dành một luồng cho một máy khách, thay vào đó bạn phân bổ một đối tượng. (Một ngày nào đó tôi sẽ muse về tính nhị nguyên giữa các chủ đề và các đối tượng.) Windows cung cấp các cổng hoàn thành I/O và một nhóm luồng để giúp bạn chuyển đổi từ mô hình dựa trên luồng sang mô hình dựa trên công việc.

1

Nếu bạn đang mắc kẹt với một thiết kế hiện có sử dụng một số lượng lớn các chủ đề và nhu cầu mở rộng quy mô, bạn cũng có thể xem xét sợi:

http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx

Nó có thể giúp bạn tiết kiệm một thiết kế lại hoàn toàn.

Indy coi nó là Indy 10, nhưng nó không bao giờ xảy ra vì cuộc phiêu lưu .NET tiêu thụ phần lớn thời gian.

+0

Liên kết thứ hai của ShuggyCoUk với OldNewThing nói về các sợi sau đây: * Lưu ý rằng các sợi không giúp ích nhiều ở đây, bởi vì một sợi có một chồng, và đó là không gian địa chỉ theo yêu cầu của ngăn xếp đó là yếu tố hạn chế gần như mọi lúc. * – foraidt

+0

Liên kết của ShuggyCoUk có nghĩa là nó không phải là giải pháp tối thượng. Tôi nhìn thấy nó nhiều hơn như là một quy mô thêm độ lớn, nơi chủ đề đầy đủ sẽ không đi. Nhưng như đã nói rằng kiến ​​thức là từ các cuộc thảo luận ngày trong một thời gian mà 64-bit có nghĩa là alpha. –

0

Mặc định ngăn xếp kích thước là 1MB và không gian địa chỉ chế độ người dùng được gán cho quy trình cửa sổ trong hệ điều hành Windows 32 bit là khoảng 2 GB. cho phép khoảng 2000 luồng cho mỗi quy trình (2000 * 1MB = 2GB). cho 64 bit, thực tế, không có vấn đề như vậy.

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