2012-01-15 32 views
10

thể trùng lặp:
Malloc thread-safe?malloc() là không reentrant nhưng thread-an toàn?

Tôi không phải là một chút nhầm lẫn trong khi tôi đang đọc "The Programming Interface Linux".

Từ cuốn sách, nó nói rằng malloc là không reentrant vì nó thao tác cấu trúc dữ liệu danh sách liên kết toàn cầu nhưng được làm an toàn thread bằng cách sử dụng mutex.

Tôi hơi bối rối về điều này: vì nó an toàn với thread bằng cách sử dụng mutex và do đó có thể được gọi bởi nhiều hơn một luồng cùng một lúc, tại sao nó không phải là một hàm reentrant? (nếu chúng tôi nói rằng reentrant có nghĩa là nó có thể được gọi bởi nhiều hơn một người gọi cùng một lúc)

Một câu hỏi khác là, vì malloc là an toàn thread, chúng ta có thể đặt nó trong một bộ xử lý tín hiệu? Tôi nghĩ rằng câu trả lời là có nhưng tôi không chắc chắn vì theo cuốn sách này, nó nói rằng chỉ có một reentrant hoặc async-tín hiệu an toàn chức năng có thể được đưa vào xử lý tín hiệu.

Có ai có thể giải thích điều này cho tôi không?

+0

Mutex có được bao gồm trong triển khai của malloc không? – Bingo

Trả lời

23

nếu chúng ta nói rằng lõm có nghĩa là nó có thể được gọi bởi nhiều hơn một người gọi cùng lúc

sai. Reentrant nghĩa là bạn có thể ngắt lời và gọi lại lần nữa trước khi hóa thân trước đó kết thúc. Hãy tưởng tượng malloc trông như thế này:

lock(mutex); 

/* Stuff. */ 

unlock(mutex): 

gì sẽ xảy ra nếu nó bị gián đoạn ở giữa, trước khi mở khóa và người khác gọi malloc?

  • Bối cảnh đầu tiên không thể tiếp tục cho đến khi cái thứ hai được thực hiện
  • Các khối bối cảnh thứ hai trên mutex và không thể tiếp tục cho đến khi là người đầu tiên mở ra các mutex

Đó là một bế tắc.

Một câu hỏi khác là, vì malloc là an toàn chỉ, chúng tôi có thể đặt nó trong bộ xử lý tín hiệu không? Tôi nghĩ câu trả lời là có

Sai lần nữa. Xem ví dụ trên. Hãy tưởng tượng chương trình chính đang thực hiện malloc và trước khi hàm thực sự kết thúc trình xử lý của bạn, gọi hàm malloc.

+0

Cảm ơn cnicutar, câu trả lời là VERY CLEAR !! – kai

+0

@kai: Lưu ý rằng vấn đề (gây nhầm lẫn các khái niệm này) càng trầm trọng bởi thực tế là các phiên bản cũ của POSIX (trước năm 2008) đã sai sử dụng từ reentrant để có nghĩa là an toàn chỉ ... –

2

Reentrancy và thread-safety là hai khái niệm khác nhau. Một chức năng reentrant có thể không an toàn thread và một chức năng an toàn thread có thể không reentrant.

Chức năng thư viện trong C không được đảm bảo là reentrant và chỉ có thể gọi hàm reentrant từ trình xử lý tín hiệu.

+0

'Một hàm reentrant có thể là không thread-safe' ... Có thể không? –

+4

@iuliux: Có. Trên một số máy, các biến tĩnh nhanh hơn các biến cục bộ dựa trên stack. Mã mà trên mục nhập sao chép các biến tĩnh của nó vào ngăn xếp, sử dụng các biến tĩnh, và sau đó khôi phục các biến từ ngăn xếp sẽ được tái nhập nhưng không an toàn luồng. – supercat

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