2008-09-28 40 views
114

Số lượng chủ đề tối đa bạn có thể tạo trong ứng dụng C# là bao nhiêu? Và điều gì xảy ra khi bạn đạt đến giới hạn này? Là một ngoại lệ của một số loại ném?Số lượng chủ đề tối đa trong ứng dụng .NET?

+0

Câu trả lời sẽ khác nhau nếu bạn đang chạy trên x64 VM hoặc x86 VM –

+0

Trong tình hình của tôi là x86, nhưng bạn có thể cung cấp câu trả lời cho cả hai trong trường hợp người khác cần nó? –

Trả lời

124

Không có giới hạn cố hữu. Số lượng chủ đề tối đa được xác định bởi số lượng tài nguyên vật lý có sẵn. Xem chi tiết article by Raymond Chen để biết chi tiết cụ thể.

Nếu bạn cần hỏi số lượng chủ đề tối đa là gì, có thể bạn đang làm điều gì đó sai.

[Cập nhật: Chỉ ra quan tâm: NET Chủ đề Pool số mặc định của bài:

  • 1023 trong Framework 4.0 (32-bit môi trường)
  • 32768 trong Framework 4.0 (64-bit môi trường)
  • 250 cho mỗi lõi trong khung 3,5
  • 25 mỗi lõi trong khung 2,0

(Những con số này có thể thay đổi tùy thuộc vào phần cứng và hệ điều hành)]

+11

Bạn đã hình dung ra điều này như thế nào? Bạn có biết .NET 4.5 là gì không, hay cái gì sẽ là 5.0? – LamonteCristo

+8

tự hỏi số điện thoại đó đến từ số – RollRoll

+2

Bạn có thể sử dụng mã này để nhận số lượng: \t \t \t int workerThreads; \t \t \t int completionPortThreads; \t \t \t ThreadPool.GetMaxThreads (out workerThreads, out completionPortThreads); – JALLRED

4

Jeff Richter trong CLR thông qua C#:

"Với phiên bản 2.0 của CLR, số lượng tối đa đề người lao động mặc định để 25 mỗi CPU trong máy và số lượng tối đa I/O chủ đề mặc định là 1000. Giới hạn 1000 không có giới hạn nào cả. "

Lưu ý điều này dựa trên .NET 2.0. Điều này có thể đã thay đổi trong .NET 3.5.

[Chỉnh sửa] Như @Mitch đã chỉ ra, điều này đặc trưng cho CLR ThreadPool. Nếu bạn đang tạo chủ đề trực tiếp, hãy xem @Mitch và các nhận xét khác.

+3

Tôi nghĩ rằng bạn đang đề cập đến threadpool. –

+0

Bạn đang nhầm lẫn giữa CLR 2.0 và .NET 2.0 trong nhận xét của bạn về .NET 3.5. – bzlm

+0

Theo như tôi biết SP1 cho .NET 2.0 (một phần của .NET 3.5) đã thay đổi các luồng công nhân mặc định là 250 cho mỗi CPU/lõi cho các nhóm luồng. –

24

Mitch là đúng. Nó phụ thuộc vào tài nguyên (bộ nhớ).

Mặc dù bài viết của Raymond dành riêng cho chủ đề Windows, chứ không phải chủ đề C#, logic cũng được áp dụng giống nhau (các chuỗi C# được ánh xạ tới các chuỗi của Windows).

Tuy nhiên, như chúng ta đang ở trong C#, nếu chúng ta muốn hoàn toàn chính xác, chúng ta cần phải phân biệt giữa chủ đề "bắt đầu" và "không bắt đầu". Chỉ các chủ đề bắt đầu thực sự dự trữ không gian ngăn xếp (như chúng ta có thể mong đợi). Không bắt đầu chủ đề chỉ phân bổ các thông tin theo yêu cầu của một đối tượng thread (bạn có thể sử dụng phản xạ nếu quan tâm đến các thành viên thực tế).

Bạn thực sự có thể kiểm tra nó cho chính mình, so sánh:

static void DummyCall() 
    { 
     Thread.Sleep(1000000000); 
    } 

    static void Main(string[] args) 
    { 
     int count = 0; 
     var threadList = new List<Thread>(); 
     try 
     { 
      while (true) 
      { 
       Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); 
       newThread.Start(); 
       threadList.Add(newThread); 
       count++; 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

với:

static void DummyCall() 
    { 
     Thread.Sleep(1000000000); 
    } 

    static void Main(string[] args) 
    { 
     int count = 0; 
     var threadList = new List<Thread>(); 
     try 
     { 
      while (true) 
      { 
       Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); 
       threadList.Add(newThread); 
       count++; 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

Đặt một breakpoint trong ngoại lệ (trong bộ nhớ, tất nhiên) trong VS để xem giá trị truy cập. Dĩ nhiên, có một sự khác biệt rất đáng kể.

5

Bạn nên sử dụng nhóm chủ đề (hoặc phân phối async, lần lượt sử dụng nhóm luồng) để hệ thống có thể quyết định số lượng chuỗi sẽ chạy.

+0

-1: Thread pool được đề cập trong một số bình luận. –

+0

Câu trả lời * là * để hệ thống quyết định. –

+0

@Ian: Tôi đã bỏ phiếu cho bạn vì cùng một câu trả lời đã được đưa ra chín tháng trước. –

7

tôi đã thử nghiệm trên hệ thống 64 bit với C# console, ngoại lệ là loại hết bộ nhớ, sử dụng 2949 luồng.

Tôi nhận ra chúng ta nên sử dụng luồng hồ bơi, mà tôi làm, nhưng câu trả lời này là để đáp lại câu hỏi chính;)

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