Tôi có một số mã trên hai hệ thống đang chạy kernel 2.4.20
và kernel 2.4.38
. Cả hai đều có gcc 3.2.2
và glibc 2.3.2
pthread_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!
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
@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. –
@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