2010-07-13 13 views
7

Tôi đã thực hiện một số re-entrancy guide về các thực tiễn được khuyến nghị khi viết mã lại.Thực tiễn được đề xuất cho mã tái nhập trong C, C++

Các tham chiếu và tài nguyên khác bao gồm chủ đề này?

Có thể sử dụng các công cụ giống như lint nào để kiểm tra các sự cố này?

+0

Đó hướng dẫn khá nhiều có mọi thứ bạn cần biết. Nó không phải là một điều rất tinh tế. Không sử dụng dữ liệu mà bạn không được thông qua trong cuộc gọi hàm, không lưu trữ bất kỳ trạng thái nào trong hàm. –

+1

Hướng dẫn đó có nhiều lỗi trong đó, từ định nghĩa về reentrancy thực sự là đa luồng (mặc dù các ví dụ xử lý tín hiệu là đúng reentrancy) thành lời khuyên xấu (mutexes ... hello deadlock) chỉ đơn giản là bugginess ('sigsuspend (& zeromask)'. Bạn vừa cho phép xử lý các ngắt mà người gọi của bạn đã vô hiệu hóa vì một lý do nào đó, hãy thử 'sigsuspend (& oldmask)' thay thế). –

Trả lời

0

Hướng dẫn là đủ.

quy tắc cá nhân của tôi về ngón tay cái chỉ có 2 tái reentering mã là:

  1. chỉ mất đi qua các tham số giá trị, sử dụng chỉ có giá trị thông qua tại như tham số trong hàm.

  2. nếu tôi cần sử dụng bất kỳ thông số hoặc con trỏ chung nào (vì hiệu suất hoặc dung lượng lưu trữ), hãy sử dụng mutex hoặc semaphore để kiểm soát quyền truy cập vào nó.

+0

Nếu bạn cần các loại phức tạp, hãy biến chúng thành bất biến nếu có thể – fmark

+0

Hi fmark: bạn có thể giải thích thêm? Hoặc chỉ cho tôi một cái gì đó liên quan đến tuyên bố này? – ttchong

+8

no No NO! Reentrancy! = Luồng. Mutexes và semaphores sẽ bế tắc mã reentrant, hoặc người nào khác âm thầm không làm công việc của họ và để lại tham nhũng dữ liệu. –

1

Không thực sự. Việc viết mã không nhập lại thường khó hơn so với việc thu hút lại. Chỉ cần làm theo những hướng dẫn đơn giản đó và đừng cố làm bất cứ điều gì quá lung lay và bạn sẽ ổn thôi.

Mã không nhập lại thường được viết cho các vấn đề hiệu suất cao.

1
  • Sử dụng biến cục bộ.
  • Không sử dụng các biến cục bộ hoặc biến toàn cầu tĩnh, ngay cả TLS sẽ không giúp bạn đệ quy/reentrancy.
  • Khôi phục tất cả các bất biến của bạn trước khi thực hiện cuộc gọi lại.
  • Không giữ khóa trong khi bạn gọi lại. Nếu bạn hoàn toàn phải (và tôi vẫn sẽ tìm kiếm một cách để tránh nó) sau đó hãy chắc chắn rằng bạn biết những gì sẽ xảy ra nếu bạn cố gắng nhập lại khóa của bạn trên sợi đã giữ nó. Ở mức tối thiểu bạn phải kiểm tra cho điều này, nếu không tùy thuộc vào khóa bạn sẽ nhận được deadlocks hoặc bất biến bị hỏng (tức là tham nhũng).
0
  1. Một chức năng reentrant có thể không sử dụng các biến trong một cách phi nguyên tử trừ khi họ là lưu trữ trên stack của nhiệm vụ gọi điện thoại hoặc là các biến riêng của nhiệm vụ đó.
  2. Chức năng reentrant có thể không gọi các chức năng khác không reentrant.
  3. Chức năng reentrant có thể không sử dụng phần cứng theo cách không nguyên tử.

Ref: Trang 462 [AN GIỚI THIỆU SỬ DỤNG RENESAS RX62N vi điều khiển] [James M. Conrad]

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