2016-12-16 15 views
5

C11 và C++ 11 xác định nguyên tử về các chủ đề thực hiện. Trong khi đó trong một môi trường lưu trữ, rõ ràng là một chủ đề là gì, nó là một thuật ngữ khá mơ hồ trong việc thực hiện ngôn ngữ tự do.Làm thế nào để hiểu nguyên tử trong việc thực thi C hoặc C++ tự do?

  1. Làm thế nào để chính thức hiểu các nguyên tử được xác định trong C11 và C++ 11 trong việc thực hiện tự do trong đó tất cả các luồng phải được triển khai bên trong chương trình? Ví dụ: ISR có phải là một chuỗi thực thi riêng biệt không?
  2. Tại sao các ủy ban tiêu chuẩn xác định nguyên tử về chủ đề và không đơn giản trong miền đặt hàng mã?
  3. Có bất kỳ trình biên dịch nhúng nào đã hỗ trợ nguyên tử C11/C++ 11 ngoài gcc không?
+0

Lưu ý C++ 11 định nghĩa * chuỗi * trong '[intro.multithread]/1'. – NathanOliver

+0

Nếu bạn chỉ có ISR, thay vì nhiều bộ xử lý/lõi, tôi muốn nói phần liên quan của tiêu chuẩn là một phần trên tín hiệu, chứ không phải là chuỗi. – EOF

+0

@NathanOliver Cảm ơn, đã xóa câu khỏi câu hỏi. – mrn

Trả lời

3

Cách tiếp cận hơi cơ học (và hơi vẫy tay) đối với loại câu hỏi này là nguyên tử đảm bảo ba điều: đọc và viết sẽ không bị rách bởi công tắc ngữ cảnh (vì vậy bạn chỉ thấy các giá trị thực sự được lưu trữ trong biến); bộ nhớ cache nhận được đỏ mặt (vì vậy bạn không thấy giá trị cũ); và trình biên dịch không thể di chuyển các lệnh trên một hoạt động nguyên tử (vì vậy các phép toán xảy ra một cách hợp lý trước khi truy cập nguyên tử thực tế xảy ra trước truy cập đó). Lưu ý rằng tôi đã cố gắng tránh bất kỳ khái niệm về "thread" ở đây, mặc dù nó được một chút lao động.

Nếu bạn đang viết cơ chế luồng của riêng mình, các thuộc tính này rõ ràng là quan trọng. Họ là trực giao với các chi tiết của cơ chế luồng mà bạn đang sử dụng. Đối với các trình xử lý tín hiệu, chúng cung cấp cho bạn một vị trí để kiểm tra các giá trị từ mã được thực hiện trong trình xử lý tín hiệu và khi trình xử lý tín hiệu cần sửa đổi các giá trị mà phần còn lại của chương trình quan tâm.

Tôi không chắc liệu tiêu chuẩn chính thức có giải quyết ISR hay không, nhưng từ quan điểm cơ học này, ISR không khác với tín hiệu không đến từ một cuộc gọi đến raise. Nó chỉ là một cuộc gọi hàm không đồng bộ và nó chiếm không gian ngăn xếp mà nó nhận được từ chuỗi bị gián đoạn. Đó chắc chắn là không phải một sợi; nó là một ký sinh trùng trên một sợi đã tồn tại. Vì vậy, đối với một ISR tôi muốn đi với các đảm bảo cho các tín hiệu hơn là đảm bảo cho các chủ đề.

+0

Một điều tôi vẫn tự hỏi là tại sao tiêu chuẩn không xác định nguyên tử dựa trên ba đảm bảo bạn đã viết, mà không có khái niệm về "thread". Nếu nó đã làm, nó sẽ làm cho không có nghi ngờ gì một phương tiện nguyên tử cho một thực hiện ngôn ngữ trần kim loại. – mrn

+0

@mrn - Tôi nghĩ chính xác vì những gì tôi viết là cơ học và vẫy tay. Tiêu chuẩn cố gắng xác định ngữ nghĩa của C++ về một máy trừu tượng và hiện tại không có khái niệm "rách" hoặc "bộ đệm". Thật vậy, có rất ít trong máy trừu tượng về bộ nhớ, và đó là cố tình, để tránh các hệ thống chứa quá nhiều. Nếu bạn nhìn kỹ, bạn sẽ thấy rằng khi bạn gọi 'toán tử new' hoặc' toán tử delete', lời hứa duy nhất bạn nhận được là "phân bổ lưu trữ" đầu tiên và "lưu trữ ... lưu trữ" thứ hai ... –

+0

... Vì vậy, đối với nguyên tử, việc sử dụng chính là giao tiếp các giá trị giữa các luồng và các định nghĩa về mặt điều gì xảy ra khi các giá trị được chia sẻ giữa các luồng. –

3

Nguyên tử là để đối phó với điều kiện chủng tộc, vì vậy không có chủ đề nào chúng hầu như không có ý nghĩa. Các ngữ cảnh duy nhất khác mà các cuộc đua có thể xảy ra là với các bộ xử lý tín hiệu, và có tiêu chuẩn C cung cấp khái niệm về khóa-freeness.

Nhìn thấy như vậy không có sự khác biệt giữa môi trường tự do và lưu trữ. Chủ đề và nguyên tử là các tính năng tùy chọn và nếu môi trường tự do hỗ trợ cả hai, nó phải tuân theo đặc điểm kỹ thuật của cả hai. Nếu nó chỉ hỗ trợ nguyên tử, nó có thể cung cấp các loại nguyên tử không khóa cho các bộ xử lý tín hiệu, nhưng các kiểu nguyên tử khác thì vô ích.

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