2013-05-12 31 views
8

Tôi muốn chương trình C của tôi được di động ngay cả trên hệ điều hành Unix rất cũ nhưng vấn đề là tôi đang sử dụng pthreads và phân bổ động (malloc). Tất cả Unix tôi biết có một malloc thread-an toàn (Linux, * BSD, Irix, Solaris) tuy nhiên điều này không được đảm bảo bởi các tiêu chuẩn C, và tôi chắc chắn rằng có những phiên bản rất cũ, nơi điều này là không đúng sự thật.Mà Unix không có một malloc thread-an toàn?

Vì vậy, có một số danh sách nền tảng mà tôi cần để kết thúc cuộc gọi malloc() bằng khóa mutex không? Tôi dự định viết một thử nghiệm ./configure để kiểm tra xem nền tảng hiện tại có nằm trong danh sách đó hay không.

Phương án thay thế khác là kiểm tra malloc() cho an toàn luồng, nhưng tôi không biết cách nào để thực hiện điều này. Bất kỳ ý tưởng về điều này quá?

+0

Câu hỏi này chỉ phù hợp với người lập trình và do đó nên được hỏi về stackoverflow. Nó có thể sẽ được di trú ở đó. –

+8

Unix cũ sẽ không có 'pthreads' ở tất cả ... – Mat

+4

Tiêu chuẩn C không có chủ đề - đó là lý do tại sao nó không được" đảm bảo ". Posix, trong số những thứ khác định nghĩa pthreads không đảm bảo nó. – nos

Trả lời

6

Tiêu chuẩn C chỉ có chủ đề (và do đó có thể có liên quan đến câu hỏi của bạn) là C11, trong đó nêu:

Đối với mục đích của việc xác định sự tồn tại của một cuộc chạy đua dữ liệu, bộ nhớ chức năng phân bổ cư xử như mặc dù họ chỉ truy cập vào bộ nhớ vị trí có thể truy cập thông qua các đối số của chúng và không lưu trữ thời gian tĩnh khác .

Hoặc nói cách khác, miễn là hai luồng không vượt qua cùng một địa chỉ đến realloc hoặc free tất cả các cuộc gọi đến các chức năng bộ nhớ đều là an toàn.

Đối với POSIX, đó là tất cả Unix'es mà bạn có thể tìm thấy ngày nay bạn có:

Mỗi chức năng được xác định trong khối lượng hệ thống giao diện của IEEE Std 1.003,1-2001 là thread-safe trừ khi quy định rõ ràng.

Tôi không biết từ đâu bạn khẳng định rằng malloc sẽ không là chủ đề an toàn cho Unix cũ hơn, hệ thống có chủ đề không thực hiện chủ đề an toàn đó là vô ích. Điều gì có thể là một vấn đề trên một hệ thống cũ hơn như vậy là hiệu năng, nhưng nó luôn luôn là chức năng.

+0

Cảm ơn! Vì vậy, tôi cho rằng tất cả các pthread hỗ trợ Unix được cho là có 'malloc()' an toàn. Nhưng khi tôi đang tìm kiếm trên internet, tôi thấy rằng việc triển khai thực hiện đối với một số phiên bản là lỗi, ví dụ: xem [ở đây] (http://sourceware.org/bugzilla/show_bug.cgi?id=6952) và [tại đây] (http://rhn.redhat.com/errata/RHBA-2009-1202.html). Vì vậy, nó khá có thể tôi sẽ viết thử nghiệm './Configure' để tránh các sự cố như vậy. – jimis

+2

@jimis, liên kết đầu tiên bạn trỏ đến không phải là lỗi khiến chương trình không hoạt động, chỉ rò rỉ bộ nhớ :) Phần thứ hai không có nhiều thông tin, vì vậy tôi không thể biết được. Nhưng đây là những ** lỗi ** của các hệ thống mà 'malloc' được dự định là luồng an toàn, không phải triển khai các luồng không có chủ đề' malloc' an toàn. Tất cả người dùng của các hệ thống như vậy ** phải ** cập nhật, dù sao đi nữa.Với phần mềm của riêng bạn, bạn không nên theo đuổi bất kỳ lỗi nào có thể đã tồn tại trong một số phiên bản của một số hệ thống. Với cách tiếp cận như vậy, hầu như không có tiến bộ nào là có thể. –

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