Tái ký dự thi không dựa trên các biến toàn cầu được tiếp xúc trong các tiêu đề thư viện C .. mất strtok() vs strtok_r() ví dụ như trong C.
Một số chức năng cần có một nơi để lưu trữ một ' công việc đang tiến hành ', các hàm lại cho phép bạn chỉ định con trỏ này trong bộ nhớ riêng của luồng, chứ không phải trong toàn cầu. Vì bộ nhớ này độc quyền với chức năng gọi, nó có thể bị gián đoạn và được nhập lại (tái nhập) và vì trong hầu hết các trường hợp, loại trừ lẫn nhau ngoài chức năng thực hiện là không cần thiết để hoạt động, chúng thường được xem xét là chủ đề an toàn. Tuy nhiên, điều này không được bảo đảm bởi định nghĩa.
errno, tuy nhiên, là một trường hợp hơi khác nhau trên hệ thống POSIX (và có xu hướng trở thành kỳ quặc trong bất kỳ giải thích về cách này tất cả các công trình) :)
Nói tóm lại, lõm thường nghĩa chủ đề an toàn (như trong "sử dụng phiên bản reentrant của chức năng đó nếu bạn đang sử dụng chủ đề"), nhưng chủ đề an toàn không phải lúc nào cũng có nghĩa là người tham gia lại (hoặc ngược lại). Khi bạn xem xét an toàn luồng, đồng thời là những gì bạn cần suy nghĩ. Nếu bạn phải cung cấp một phương tiện khóa và loại trừ lẫn nhau để sử dụng một hàm, thì hàm này không phải là chủ đề an toàn.
Nhưng, không phải tất cả các chức năng cũng cần được kiểm tra. malloc()
không cần phải reentrant, nó không phụ thuộc vào bất cứ điều gì trong phạm vi của các điểm nhập cảnh cho bất kỳ chủ đề nhất định (và là chính nó thread an toàn).
Các hàm trả về giá trị được phân bổ tĩnh là không chủ đề an toàn mà không sử dụng mutex, futex hoặc cơ chế khóa nguyên tử khác. Tuy nhiên, họ không cần phải reentrant nếu họ sẽ không bị gián đoạn.
tức là .:
static char *foo(unsigned int flags)
{
static char ret[2] = { 0 };
if (flags & FOO_BAR)
ret[0] = 'c';
else if (flags & BAR_FOO)
ret[0] = 'd';
else
ret[0] = 'e';
ret[1] = 'A';
return ret;
}
Vì vậy, như bạn thấy, có nhiều chủ đề sử dụng rằng nếu không có một số loại khóa sẽ là một thảm họa .. nhưng nó không có mục đích là re-entrant. Bạn sẽ chạy vào đó khi bộ nhớ được cấp phát động là điều cấm kỵ trên một số nền tảng được nhúng.
Trong lập trình hoàn toàn chức năng, lõm thường không hàm ý chủ đề an toàn, nó sẽ phụ thuộc vào hành vi của chức năng xác định hoặc nặc danh thông qua với điểm vào chức năng, đệ quy, vv
Cách tốt hơn để đặt 'an toàn chủ đề' là an toàn để truy cập đồng thời, minh họa tốt hơn nhu cầu.
lõm nào không bao hàm thread-safe. Các hàm thuần túy ngụ ý sự an toàn của luồng. –
Câu trả lời tuyệt vời Tim. Chỉ cần để làm rõ, sự hiểu biết của tôi từ "thường xuyên" của bạn là thread-safe không ngụ ý reentrant, nhưng cũng reentrant không ngụ ý thread-an toàn. Bạn sẽ có thể tìm thấy một ví dụ về một chức năng reentrant đó là * không * thread-an toàn? – Riccardo
@ Tim Post "Trong ngắn hạn, reentrant thường có nghĩa là thread an toàn (như trong" sử dụng phiên bản reentrant của chức năng đó nếu bạn đang sử dụng chủ đề "), nhưng thread an toàn không phải lúc nào cũng có nghĩa là tái nhập cảnh." qt [nói] (http://qt-project.org/doc/qt-4.8/threads-reentrancy.html) đối diện: "Do đó, một hàm an toàn chủ đề luôn luôn là reentrant, nhưng một chức năng reentrant không phải luôn luôn thread- an toàn. " – 4pie0