2010-09-17 30 views
7

Tôi đang cố triển khai thư viện nguyên tử từ bản nháp C++ 0x. Cụ thể, tôi đang thực hiện §29.6/8, cửa hàng phương pháp:Thực hiện nguyên tử <T> :: lưu trữ

template <typename T> 
void atomic<T>::store(T pDesired, memory_order pOrder = memory_order_seq_cst); 

Các tiểu bang yêu cầu:

Đối số thứ tự sẽ không được memory_order_consume, memory_order_acquire, cũng không memory_order_acq_rel.

Tôi không biết phải làm gì nếu đây là một trong số này. Tôi có nên làm gì, ném một ngoại lệ, nhận hành vi không xác định, hoặc làm cái gì khác?

P.S .: "C++ 0X" tựa hồ như một con cá chết: 3

+7

+1 cho cá chết. – GManNickG

Trả lời

9

Hãy làm những gì bạn muốn. Nó không quan trọng.

Khi ISO tuyên bố rằng bạn "sẽ không làm điều gì đó", hãy thực hiện hành vi không xác định. Nếu một người dùng làm điều đó, họ đã vi phạm hợp đồng với việc thực hiện và việc thực hiện nằm trong quyền của mình để thực hiện.

Điều bạn quyết định làm hoàn toàn tùy thuộc vào bạn. Tôi sẽ lựa chọn bất cứ điều gì làm cho việc thực hiện của bạn "tốt hơn" (trong mắt bạn, nhanh hơn, dễ đọc hơn, tùy thuộc vào nguyên tắc ít ngạc nhiên nhất, vv).

Bản thân tôi, tôi sẽ đi để dễ đọc (vì tôi sẽ phải duy trì điều này) với tốc độ tham gia một giây gần.

0

Tôi muốn có hành vi điên rồ mơ hồ hơn khi có điều gì đó điên rồ. Vâng, với tư cách là người tiêu dùng tiềm năng của thư viện của bạn, đây là những gì tôi muốn: nếu không có chi phí hiệu suất cho việc sử dụng tài liệu, hãy xem liệu một trong các giá trị memory_order có cung cấp một superset chức năng của những người khác hay không, đặc biệt là một cái gì đó tương ứng những gì người gọi có thể ngây thơ mong đợi các chế độ không được hỗ trợ để làm (nếu có bất kỳ kỳ vọng hợp lý nào có thể được hình thành). Người gọi có thể nhận được chế độ chậm nhất, an toàn nhất, nhưng đó là tốt hơn so với một cái gì đó chức năng sai. Bạn giảm thiểu sự phụ thuộc của mã máy khách để có được mọi thứ hoàn hảo cho mã của bạn. Vấn đề với điều này - so với một khẳng định/ngoại lệ - là nó có thể không được chú ý trong một môi trường thử nghiệm, vì vậy hãy xem xét việc viết một lời giải thích cho std :: cerr, sử dụng một biến tĩnh để giới hạn các thông điệp đến một cho mỗi quá trình chạy. Đó là một chẩn đoán rất hữu ích.

Một ngoại lệ, khẳng định gây tử vong, v.v. có thể làm giảm ứng dụng của khách hàng vào một thời điểm rất bất tiện .... Có vẻ như một chút draconian, và không phải thứ tôi đặc biệt đánh giá cao. Một tùy chọn khác là để có một biến môi trường kiểm soát hành vi này.

(Có lẽ một vấn đề tương tự cho các giá trị mà không phải là ngay cả trong liệt kê hiện tại của bạn.)

+3

Nếu bạn dựa vào hành vi không xác định, tôi muốn thực hiện của tôi định dạng lại đĩa cứng của bạn (đó thực sự là hành vi hợp lệ). Đó là bởi vì, trong khi bạn đang khôi phục nó, bạn sẽ không được đẩy ra mã buggy :-) Có thể có _no_ hành vi sai chức năng nếu nó không xác định, đó là những gì "undefined" có nghĩa là. – paxdiablo

+0

@paxdiablo. Thật là một tuyên bố vô nghĩa. Hành vi không xác định thường được gọi vô tình, do đó câu hỏi ở nơi đầu tiên. Lớn lên. Nó được gọi là "lập trình phòng ngự", và tôi bị bệnh của tất cả các loại thiết kế theo hợp đồng hành động như những đứa con trai xấu. –

+3

Điều bạn muốn có là không liên quan. Tiêu chuẩn nói rằng bạn không được phép làm điều đó để người triển khai tự do làm bất cứ điều gì họ muốn. Họ có thể chọn để xử lý nó một cách duyên dáng hoặc họ có thể (và đây là sở thích của tôi) chỉ cần bỏ qua nó và bạn có thể sửa mã của riêng bạn. Tôi không có ở đó để xử lý bạn nếu bạn vi phạm các quy tắc. Không có gì khác với những người rên rỉ về thực tế là 'i = ++ i + i ++;' không hoạt động như mong đợi - câu trả lời là _không làm điều đó! _ Và, nếu đó là bạn rằng câu trả lời của tôi là -1 (giả định về phần của tôi nhưng có lẽ đúng cho giọng của bạn), tôi đoán tôi là "lớn lên" đủ để không trả thù. – paxdiablo

0

tôi thích một lỗi thời gian biên dịch. Nếu không có, thì một lỗi assert().

Khẳng định là tốt vì nó biên dịch ra khỏi phiên bản phát hành và sẽ không ảnh hưởng đến hiệu suất.

Lỗi thời gian biên dịch thậm chí còn tốt hơn vì chúng cung cấp thêm phản hồi ngay lập tức mà không cần chờ phần mềm đi qua lỗi. Biên dịch kiểm tra lỗi thời gian là một điều tôi thích về mã C++ trên Python, Ruby, mã Perl.

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