2012-07-05 24 views
6

Tôi có một số mã trên hai hệ thống đang chạy kernel 2.4.20kernel 2.4.38. Cả hai đều có gcc 3.2.2glibc 2.3.2pthread_create sự khác biệt trong hạt nhân linux 2.4.20 và 2.4.36

Dưới kernel 2.4.38, xử lý pthread_t không được sử dụng lại. Dưới thử nghiệm tải trọng nặng, ứng dụng gặp sự cố khi tay cầm đạt được 0xFFFFFFFF.

(Tôi nghi ngờ này ở nơi đầu tiên vì treo ứng dụng trong triển khai mà nó sử dụng một cổng mạng Máy quét các chủ đề được tạo ra để xử lý các kết nối socket)

ví dụ đơn giản này tái tạo lại vấn đề:

void* ThreadProc(void* param) 
{ 
    usleep(10000); 
    printf(" Thread 0x%x\n", (unsigned int)pthread_self()); 
    usleep(10000); 
    return NULL; 
} 

int main(int argc, char* argv[]) 
{ 
    pthread_t sThread; 

    while(1) 
    { 
     pthread_create(&sThread, NULL, ThreadProc, NULL); 
     printf("Created 0x%x\n", (unsigned int)sThread); 
     pthread_join(sThread, NULL); 
    }; 

    return 0; 
} 

Dưới 2.4.20:

Created 0x40838cc0 
    Thread 0x40838cc0 
    Created 0x40838cc0 
    Thread 0x40838cc0 
    Created 0x40838cc0 
    Thread 0x40838cc0 
...and on and on... 

Dưới 2.4.36:

Created 0x4002 
    Thread 0x4002 
    Created 0x8002 
    Thread 0x8002 
    Created 0xc002 
    Thread 0xc002 
...keeps growing... 

Làm cách nào để có được kernel 2.4.36 để xử lý tái chế? Thật không may tôi không thể thay đổi hạt nhân một cách dễ dàng. Cảm ơn!

+1

Chúc mừng quá khứ! Tôi không nghĩ rằng tùy thuộc vào chương trình của bạn trên một hành vi hạt nhân như vậy là một ý tưởng tốt, bạn nên thay vì sửa chữa chương trình của bạn. – PlasmaHH

+0

@PlasmaHH: Chương trình là tốt; 'pthread_join' sẽ giải phóng tất cả các tài nguyên luồng. Vấn đề là, trên phiên bản hạt nhân cụ thể, nó dường như không. –

+0

@MikeSeymour: Điều gì khiến bạn nghĩ vậy? Đối với tôi, nó có vẻ như nó đang đưa ra một xử lý khác nhau mỗi lần, một cái gì đó là hoàn toàn tốt đẹp, ngay cả khi xử lý trước đó đã được giải thoát. Giống như a = malloc (5), miễn phí (a); a == malloc (5); không đúng. – PlasmaHH

Trả lời

4

Nếu quan sát của bạn đúng, chỉ có hai giải pháp có thể tồn tại.

Hoặc

  1. Nâng cấp hạt nhân. Điều này có thể hoặc có thể không khả thi đối với bạn.
  2. Chủ đề tái chế trong ứng dụng của bạn.

Tùy chọn 2 là thứ bạn có thể làm ngay cả khi hạt nhân đang hoạt động không đúng. Bạn có thể giữ một nhóm các chủ đề vẫn còn trong trạng thái ngủ khi không được sử dụng. Hồ bơi chủ đề là một mô hình kỹ thuật phần mềm được biết đến rộng rãi (xem http://en.wikipedia.org/wiki/Thread_pool_pattern). Đây có lẽ là giải pháp tốt hơn cho bạn.

+1

Luôn luôn có '3. back-port một bản sửa lỗi từ phiên bản hạt nhân trong tương lai và xây dựng lại kernel của riêng bạn –

+0

@Kevin A. Naudé: Vâng, tôi có lẽ sẽ phải triển khai một nhóm luồng. Tôi vẫn hy vọng ai đó sẽ biết về một giải pháp đơn giản cho hạt nhân 2.4.36. Như tôi đã nói, tôi không thể thay đổi hạt nhân dễ dàng. (bao gồm xây dựng của riêng tôi) – Scott

+0

@Scott: Nếu bạn thậm chí không thể xây dựng một hạt nhân được vá sửa lỗi, thì bạn không có hy vọng sửa chữa hạt nhân. Dường như việc tạo nhóm luồng có thể là lựa chọn tốt nhất của bạn (có thể chỉ). –

0

Hóa ra tôi đã không tham gia chủ đề của mình đúng cách trong bài kiểm tra tải.

Khi tôi chạy lại kiểm tra tải, tay cầm chỉ đạt 0xFFFFF002 rồi cuộn qua 0x1002 và tiếp tục vui vẻ.

Đạo đức của câu chuyện: Hãy chắc chắn rằng các chủ đề của bạn được nối hoặc tách ra!

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