2015-07-04 16 views
10

In glibc, malloc is implemented with arenas. Vì vậy, ví dụ, có thể bộ nhớ được phân bổ lần đầu bởi malloc và sau đó là free d trong chủ đề A không thể sử dụng bằng một cuộc gọi khác là malloc trong chủ đề B, vì luồng A và B có thể nằm trong các đấu trường khác nhau và các đấu trường khác nhau duy trì các heap khác nhau và danh sách bộ nhớ miễn phí.Trong C++, có thể mới trong một luồng phân bổ bộ nhớ bị xóa bởi một chuỗi khác không?

Khi nói đến C++ (có thể cũng C++ 11 vì C++ 11 có tiêu chuẩn mới), câu chuyện vẫn như cũ?

Hoặc các chủ đề khác nhau thực sự chia sẻ cùng một phân đoạn danh sách bộ nhớ và miễn phí, và new trong một chuỗi có thể phân bổ bộ nhớ trước tiên new ed và sau đó delete d theo chuỗi khác?

Nếu câu trả lời phụ thuộc vào việc triển khai thực hiện, thì câu hỏi đặt ra là chúng được triển khai như thế nào trong các trình biên dịch C++ chính, chẳng hạn như g ++, MVC++, icc?

EDIT

Tôi nghĩ rằng câu hỏi này là hợp lệ theo nghĩa là đôi khi bạn khởi động nhiều đề và trong mỗi chủ đề bạn tự động phân bổ/deallocate một đoạn lớn của bộ nhớ cho một số lượng lớn của các đối tượng, và bạn không muốn sử dụng bộ nhớ của ứng dụng của bạn để đi ridiculously cao.

+1

C++ không chỉ định cách thực hiện các chức năng phân bổ, chỉ những kết quả mà chúng phải tạo ra. –

+0

Trong thực tế 'new' gọi' malloc'. Nhưng không rõ bạn đang hy vọng làm gì với thông tin đó. –

+0

bạn có nghĩa là 'mới' được thực hiện bởi' malloc'? Chuẩn này có được chuẩn hóa không? – Allanqunzi

Trả lời

2

này:

chủ đề khác nhau thực sự chia sẻ cùng phân khúc của heap và danh sách miễn phí bộ nhớ, và mới trong một thread có thể phân bổ bộ nhớ newed đầu tiên và sau đó xóa bởi một thread

Mục đích của các chủ đề - chia sẻ không gian bộ nhớ. Nếu bạn không cần tính năng này, bạn nên sử dụng quy trình tốt hơn.

+0

Xin lưu ý rằng trong C, có thể không gian bộ nhớ trống có thể truy cập được đối với một số chủ đề có thể không truy cập được vào một chuỗi khác. Tôi hỏi hành vi trong C++, tôi không nói về một cái gì đó giống như truy cập các biến trên các chủ đề khác nhau. – Allanqunzi

+0

@Allanqunzi - nếu đó là trường hợp, đừng bận tâm với chủ đề vì lợi thế chính của họ trên các quy trình là dễ dàng hơn inter-thingy comms. –

0

Điều đó tùy thuộc. Trên cửa sổ, một chủ đề sử dụng DLL không được phép chuyển quyền sở hữu bộ nhớ được cấp phát trong một DLL sang một DLL khác. Tất cả các tin tức và xóa phải được thực hiện trên "cùng một bên" của DLL. Mặc dù đây không phải là vấn đề nghiêm ngặt về luồng, nhưng nó vẫn ngụ ý rằng một luồng không thể chuyển quyền sở hữu bộ nhớ sang bất kỳ luồng nào khác mà không biết nguồn gốc của bộ nhớ.

Xem Do (statically linked) DLLs use a different heap than the main program?

+2

Không có điều gì như là một "DLL dựa trên thread". Bộ nhớ phân bổ trong một DLL bằng "mới" không thể được deallocated trong một DLL hoặc ứng dụng chính bằng cách "xóa" - điều này không liên quan đến chủ đề. – immibis

+0

Tôi đã thay đổi từ ngữ từ "DLL dựa trên chủ đề" thành "chuỗi sử dụng DLL" vì đó là ý của tôi. –

+0

Nếu các tệp DLL được biên dịch cùng trình biên dịch và cờ thì không có vấn đề gì với bộ nhớ deallocating được cấp phát trong một DLL khác. –

1

C++ std và thực hiện cấp phát bạn sử dụng là hai việc khác nhau .. Nếu bạn sử dụng gcc để biên dịch C++ mã của bạn, nó theo mặc định sử dụng glibc như bộ cấp phát. Vì vậy, nếu gcc của bạn là một phiên bản đủ mới hơn, nó sử dụng glibc với các đấu trường cho mỗi luồng và bạn có thể thực hiện tốt.

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