2012-05-11 38 views
6

Tôi thấy điều này trong một phần mà không bao giờ được gọi trong mã của một đồng nghiệp:Trong khi (! Dễ bay hơi); làm gì?

volatile unsigned char vol_flag = 0; 
// ... 
while(!vol_flag); 

vol_flag được khai báo trong file header, nhưng không bao giờ thay đổi. Tôi có chính xác rằng điều này sẽ dẫn đến chương trình treo trong một vòng lặp vô hạn? Có cách nào thoát khỏi nó?

+2

Dường như một số khóa quay kém được thực hiện trong mã đa luồng. –

+1

Có thể nó là để gỡ lỗi? – animaonline

+2

Mã như thế này thường được tìm thấy trong các chương trình dành cho bộ điều khiển vi mô. – alexander

Trả lời

16

Thông thường một mã như thế này cho biết rằng vol_flag dự kiến ​​sẽ được thay đổi bên ngoài tại một số điểm. Ở đây, bên ngoài có thể có nghĩa là một chuỗi khác, một trình xử lý ngắt, một phần cứng (trong trường hợp bộ nhớ ánh xạ IO) vv. Vòng lặp này có hiệu quả chờ sự kiện bên ngoài thay đổi cờ.

Từ khóa volatile là một cách để lập trình viên thể hiện thực tế là không an toàn để giả sử những gì rõ ràng từ mã: đó là cờ không bị thay đổi trong vòng lặp. Do đó, nó ngăn cản trình biên dịch thực hiện tối ưu hóa có thể thỏa hiệp các ý định đằng sau mã. Thay vào đó, trình biên dịch buộc phải tạo một tham chiếu bộ nhớ để lấy giá trị của cờ.

Lưu ý rằng (không giống như trong Java) volatile trong C/C++ không thiết lập mối quan hệ xảy ra trước mối quan hệ và không đảm bảo bất kỳ thứ tự hoặc hiển thị tham chiếu bộ nhớ nào trên truy cập dễ bay hơi. Hơn nữa, nó không đảm bảo nguyên tử của các tham chiếu biến đổi. Vì vậy, nó không phải là một công cụ để giao tiếp giữa các luồng. Xem this để biết chi tiết.

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