Người ta nói rằng bạn chỉ nên gọi các chức năng không đồng bộ an toàn bên trong bộ xử lý tín hiệu. Câu hỏi của tôi là gì, những gì cấu thành an toàn không đồng bộ? Một chức năng vừa là reentrant và chủ đề an toàn là không đồng bộ an toàn Tôi đoán? Hay không?Điều gì cấu thành sự an toàn không đồng bộ
Trả lời
Tái nhập cảnh và an toàn chỉ có một chút hoặc không có gì để thực hiện việc này. Các tác dụng phụ, trạng thái và gián đoạn của các chức năng đó là các sự kiện quan trọng.
asynchronous-safe function [GNU PTH]
Một chức năng là không đồng bộ an toàn, hoặc an toàn không đồng bộ tín hiệu, nếu nó có thể được gọi một cách an toàn và không có tác dụng phụ từ bên trong một bối cảnh xử lý tín hiệu. Tức là, nó phải là có thể bị gián đoạn tại bất kỳ thời điểm nào để chạy tuyến tính ngoài chuỗi mà không gây ra trạng thái không nhất quán. Nó cũng phải hoạt động đúng cách khi dữ liệu toàn cục có thể ở trạng thái không nhất quán. Một số hoạt động không đồng bộ an toàn được liệt kê ở đây:
- gọi các
signal()
chức năng để cài đặt lại một handler tín hiệu- vô điều kiện sửa đổi một biến
volatile sig_atomic_t
(như sửa đổi để loại này là nguyên tử)- gọi các
_Exit()
chức năng đến ngay lập tức chấm dứt thực hiện chương trình- gọi hàm an toàn không đồng bộ , như được chỉ định bởi triển khai của bạn
Một số chức năng là an toàn không đồng bộ một cách an toàn. Nếu một hàm thực hiện bất kỳ hoạt động nào khác của , nó có thể không an toàn không đồng bộ.
Quy tắc chung là điều này - chỉ báo hiệu một số biến điều kiện từ trình xử lý tín hiệu (chẳng hạn như điều kiện futex/pthread, wake up epoll loop, v.v.).
UPDATE:
Như EmployedRussian đề nghị, thậm chí kêu gọi pthread_cond_signal
là một ý tưởng tồi. Tôi đã kiểm tra mã nguồn của eglibc
gần đây và nó có cặp khóa/mở khóa trong đó. Vì vậy, giới thiệu một khả năng cho một bế tắc. Điều này khiến chúng tôi có một vài tùy chọn để báo hiệu các chủ đề khác:
- Sử dụng
eventfd
. - Thay đổi biến nguyên tử toàn cầu và hy vọng SA_RESTART không được đặt và các chủ đề khác sẽ kiểm tra nguyên tử của chúng tôi.
Có một danh sách lớn hơn nhiều chức năng được [bảo đảm an toàn-tín hiệu-an toàn bởi POSIX.1-2008] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03) (bạn sẽ phải cuộn xuống một chút cho danh sách), bao gồm phần lớn các cuộc gọi hệ thống "Unix" truyền thống và truy cập vào 'errno'. Ngoài ra, nếu bạn biết rằng trình xử lý tín hiệu của bạn sẽ chỉ được gọi khi thực thi bình thường bị chặn trên ['sigsuspend'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigsuspend.html), thì sẽ an toàn làm công cụ tùy ý trong trình xử lý. – zwol
Không có chức năng 'pthread_ *' nào là an toàn-tín hiệu an toàn, do đó, "biến điều kiện tín hiệu pthread" là một lời khuyên xấu (TM). –
@EmployedRussian: Không phải là nó không an toàn, nó có thể không đánh thức ai đó chờ đợi trên một biến điều kiện POSIX. –
Đối với mã của riêng bạn, có, tái nhập và đảm bảo an toàn là những đặc điểm bạn cần, tùy thuộc vào cách bạn thiết lập cơ chế xử lý tín hiệu của mình, bộ xử lý tín hiệu của bạn có thể bị gián đoạn bởi tín hiệu khác. Nói chung, hãy cố gắng làm càng ít công việc càng tốt bên trong bộ xử lý tín hiệu.Đặt cờ để kích hoạt mã đặc biệt trong luồng chương trình bình thường của bạn có lẽ là tất cả những gì bạn nên làm.
Đối với các chức năng trong hệ điều hành mà bạn có thể gọi, hãy xem man 7 signal
để biết danh sách những gì an toàn để gọi. Lưu ý rằng malloc()
và free()
là không phải trong danh sách. Các API đồng bộ hóa pthread cũng không nằm trong danh sách, nhưng tôi nghĩ rằng một số sẽ phải an toàn để gọi, vì vậy bạn có thể thiết lập một cờ toàn cục một cách an toàn trong một trình xử lý tín hiệu.
- 1. Sử dụng C++ 11 lambdas không đồng bộ, an toàn
- 2. Tạo chuỗiWithContentsOfURL không đồng bộ - Có an toàn không?
- 3. Sự khác nhau giữa đề an toàn và an toàn
- 4. Cấu hình Devise an toàn nhất có thể là gì?
- 5. Điều gì chính xác cấu thành "đồng bộ hóa lịch đầy đủ" trong EKCalendar?
- 6. Có an toàn khi kết nối NetworkStream với BufferedStream để đọc không đồng bộ không?
- 7. DWScript có an toàn không?
- 8. Chơi bộ điều khiển khung với các phương pháp an toàn và không an toàn. Khả thi?
- 9. Sự khác nhau giữa chặn với đồng bộ, không chặn và không đồng bộ là gì?
- 10. Có phải không đồng bộ ghi vào một ổ cắm an toàn không?
- 11. Sử dụng EJBCtext getContextData - điều này có an toàn không?
- 12. Biến sự kiện thành cuộc gọi không đồng bộ
- 13. Có an toàn khi gọi phương thức được đồng bộ từ một phương thức được đồng bộ khác không?
- 14. Tại sao tín hiệu không đồng bộ hóa malloc an toàn?
- 15. Đồng bộ hóa điều kiện là gì?
- 16. Chủ đề java.util.Hashtable có an toàn không?
- 17. Mã an toàn chủ đề mà không sử dụng từ khóa `được đồng bộ hóa '?
- 18. Có cách nào an toàn để chuyển đổi Bộ sưu tập thành chuỗi trong F # không?
- 19. Cấu trúc bản đồ có an toàn không?
- 20. Điều gì cấu thành 'thời gian thực'
- 21. Điều gì có nghĩa là "đồng bộ hóa nhanh" không được đồng bộ hóa?
- 22. Mã an toàn và không an toàn
- 23. Các cuộc gọi đến các phương thức Javascript có an toàn hoặc đồng bộ hóa không?
- 24. Java và XML (JAXP) - Điều gì về bộ nhớ đệm và an toàn luồng?
- 25. An toàn loại an toàn()
- 26. Cơ chế an toàn không an toàn Arduino
- 27. msdn: "An toàn chủ đề" là gì?
- 28. Cách sử dụng Mẫu mã đồng bộ hóa để ngăn CSRF an toàn như thế nào?
- 29. SQL - AN TOÀN xuống một cách an toàn BIGINT thành INT
- 30. Thiết kế cấu trúc dữ liệu an toàn chủ đề
Tìm thấy [this] (https://www.securecoding.cert.org/confluence/display/seccode/BB.+Definitions). Vì vậy, có vẻ như chức năng có thể không sử dụng các biến toàn cầu (bên cạnh các loại nguyên tử) và làm gián đoạn nó ở bất kỳ điểm nào nên rời khỏi quá trình trong trạng thái nhất quán. – elmo