2013-05-02 26 views
7

Kể từ khi nâng cấp môi trường phát triển và xây dựng của chúng tôi từ VS2008 lên VS2012, tôi bối rối về ý nghĩa của việc sử dụng từ khóa volatile trong codebase cũ của chúng tôi. mẫu được sao chép để quản lý chuỗi từ ngày "cũ").Thực tiễn tốt nhất để sử dụng từ khóa 'dễ bay hơi' trong VS2012

Microsoft có những nhận xét sau đây trong tài liệu VS2012:

Nếu bạn đã quen thuộc với C# dễ bay hơi từ khóa, hoặc quen thuộc với hành vi của dễ bay hơi trong các phiên bản trước của Visual C++, được nhận thức rằng từ khóa C++ 11 ISO Standard dễ bay hơi là khác nhau và được hỗ trợ trong Visual Studio khi tùy chọn biên dịch /volatile:iso được chỉ định. (Đối với ARM, nó được chỉ định theo mặc định). dễ bay hơi từ khóa trong C++ 11 Mã ISO chuẩn chỉ được sử dụng để truy cập phần cứng; không sử dụng nó cho giao tiếp giữa các luồng. Đối với liên lạc liên ren, hãy sử dụng các cơ chế như std::atomic<T> từ Thư viện mẫu chuẩn C++.

Nó tiếp tục nói:

Khi tùy chọn /volatile:ms trình biên dịch được sử dụng theo mặc định khi kiến ​​trúc khác so với ARM được nhắm mục tiêu-trình biên dịch tạo thêm mã để duy trì trật tự trong tài liệu tham khảo cho các đối tượng dễ bay hơi trong ngoài việc duy trì thứ tự tham chiếu đến các đối tượng toàn cầu khác.

Tôi thực hiện điều này có nghĩa là mã hiện tại của chúng tôi sẽ không bị hỏng nhưng không nhất thiết phải di động (không phải là vấn đề đối với chúng tôi).

Tuy nhiên, nó làm tăng những câu hỏi này, mà tôi muốn một số lời khuyên, nếu có thể:

  1. Chúng ta có nên loại bỏ sử dụng của volatile vòng loại trong mã của chúng tôi của chúng tôi và thay thế bằng C++ 11 ISO tiêu chuẩn phù hợp tương đương, mặc dù chúng tôi sẽ không chuyển mã khỏi MS?
  2. Nếu chúng ta không làm như trên, có bất kỳ nhược điểm nào không?

Tôi đánh giá cao đây không phải là vấn đề lập trình cụ thể nhưng chúng tôi đang bắt tay vào một số phép tái cấu trúc khá lớn và tôi muốn cung cấp một số nguyên tắc hợp lý cho công việc này.

+1

Vui lòng sửa lỗi. Nếu không, một số đồng nghiệp của bạn sẽ, sau này trong cuộc sống của họ, trở thành đồng nghiệp của tôi và tôi không muốn phải dạy họ rằng "dễ bay hơi! = Thread-safe mặc dù bạn đã làm nó trong nhiều năm". – screwnut

+0

Tôi sẽ làm hết sức mình - nhưng "sau này trong cuộc đời" hầu hết các đồng nghiệp của tôi sẽ được nghỉ hưu, cùng với tôi ;-) –

Trả lời

6
  1. Nếu bạn có thời gian cho nó. Những lợi ích không phải là tuyệt vời - nguyên tử C++ 11 có thể cho phép kiểm soát chính xác hơn đối với loại đồng bộ bạn cần, và có ngữ nghĩa rõ ràng hơn, có thể cho phép trình biên dịch tối ưu hóa mã tốt hơn.
  2. Về lý thuyết, nhưng rất không chắc, một phiên bản tương lai của trình biên dịch có thể giảm hỗ trợ cho kiểu MS biến động hoàn toàn. Hoặc một ngày bạn thực sự muốn chuyển ra khỏi trình biên dịch MS, ngay cả khi bạn ở lại trên Windows. Nếu bây giờ bạn đang tái cấu trúc, đó có thể là thời điểm thích hợp để thực hiện công việc thay thế các chất bay hơi bằng nguyên tử, giúp bạn không thể thực hiện công việc trong tương lai.
+0

Cảm ơn Sebastian - chúng tôi đang suy nghĩ theo cùng một dòng, điều đó tốt, tôi ' m chỉ cảnh giác vì việc tái cấu trúc các bit "biến động" để sử dụng các nguyên tử sẽ có xu hướng dẫn tôi xem xét mã đa luồng của chúng ta nói chung hơn, vì vậy tôi đang tìm "nơi tốt để dừng" và gặp khó khăn khi xem nó! 1 cho lời khuyên. –

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