Tôi đang ở trong tình huống cần đọc một cây tìm kiếm nhị phân (BST) bên trong bộ xử lý tín hiệu (SIGSEGV bộ xử lý tín hiệu, theo kiến thức của tôi là trên cơ sở luồng). BST có thể được sửa đổi bởi các chủ đề khác trong ứng dụng.Đọc dữ liệu được chia sẻ bên trong bộ xử lý tín hiệu
Giờ đây, vì trình xử lý tín hiệu không thể sử dụng các ẩn dụ, mutex vv, do đó không thể truy cập dữ liệu được chia sẻ, Làm cách nào để giải quyết vấn đề này? Lưu ý rằng ứng dụng của tôi đa luồng và chạy trên một hệ thống đa lõi.
Tôi sẽ cố gắng thực sự, thực sự khó khăn, để nghĩ ra một cách để không đọc dữ liệu được chia sẻ trong trình xử lý tín hiệu đó. – dbeer
Để nhấn mạnh điểm của @dbeer, trong trình xử lý tín hiệu, bạn thường không nên làm bất cứ điều gì sẽ chặn hoặc tăng các tín hiệu khác hoặc bất kỳ thao tác dài nào. Bộ xử lý tín hiệu phải nhỏ, nhanh và ngắn. –
Có lẽ tôi đang thiếu một cái gì đó, nhưng nếu chỉ có các chủ đề của chương trình của bạn truy cập vào bộ nhớ chia sẻ (không có ngắt và ngoại lệ khác), tại sao bạn không thể sử dụng một semaphore (cho dù đó là phong cách tốt là một câu hỏi khác nhau)? Nếu một luồng truy cập vùng quan trọng, chặn nó, được đặt vào giấc ngủ bởi một luồng khác, semaphore vẫn bị khóa cho luồng khác, và cuối cùng luồng ban đầu của bạn sẽ được lên lịch để truy cập lại nó. Lý do hiệu suất sang một bên, tôi thấy không phải là một mối nguy hiểm của dữ liệu tham nhũng cũng không trì hoãn hệ thống. – gnometorule