2015-06-01 15 views
8

Tôi có giao dịch bị vô thời hạn vì một số lý do và tôi muốn sử dụng các hướng dẫn theo dõi bên trong. Ví dụ: để in trạng thái của MVar trước khi thực hiện giao dịch trong đoạn này:Có an toàn khi sử dụng dấu vết bên trong sự phân chia STM không?

data_out <- atomically $ do 
     rtg_state <- takeTMVar ready_to_go 
     JobDescr hashid url <- T.readTBChan next_job_descr 
     case rtg_state of 
      Ready_RTG n -> do 
       putTMVar ready_to_go $ Processing_RTG n 
       putTMVar start_harvester_browser hashid 
       putTMVar next_test_url_to_check_chan hashid 
       putTMVar next_harvest_url hashid 
       return (n,hashid,url) 
      _ -> retry 

Điều đó có làm cho chương trình bị phân đoạn hoặc bỏ lỡ hoạt động không?

Trả lời

9

Miễn là bạn sử dụng trace chỉ cho mục đích gỡ lỗi, bạn nên OK. Theo nguyên tắc chung, chỉ cần giả định rằng trong phiên bản sản phẩm cuối cùng sẵn sàng của chương trình của bạn sẽ không có trace s xung quanh.

Bạn sẽ không bao giờ quan sát segfaults từ trace. "Unsafety" của nó bắt nguồn từ nó tiêm các hiệu ứng quan sát được trong mã thuần túy. Ví dụ: trong STM, khi giao dịch được thử lại, các hiệu ứng của nó được giả định là được khôi phục. Nếu trace được sử dụng để gửi tin nhắn cho người dùng, bạn không thể cuộn lại. Nếu đầu ra của trace kích hoạt khởi chạy tên lửa, bạn sẽ phải đối phó với các tác dụng phụ quốc tế. Nếu trace thay vì chỉ báo hiệu nhà phát triển với "FYI, mã đang thực hiện X", đây không phải là một phần của logic cốt lõi của chương trình và hoàn toàn ổn.

+0

Mã khởi chạy tên lửa sẽ được giữ sau đó trong đơn IO. Cảm ơn! – dsign

+4

Tôi thấy nó đáng để chỉ ra rằng nó không phải là một sự phóng tên lửa đơn lẻ mang lại những tác dụng phụ nghiêm trọng trong trường hợp này - đó là 735 hạt nhân khi giao dịch được thử lại nhiều lần bạn phải cẩn thận. ;) – kqr

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