2014-06-16 15 views
5

Tiêu chuẩn OpenMP (< = 4.0) nói về atomic:Nguyên tử OpenMP trên loại tham chiếu?

#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt

nơi expression-stmt là một tuyên bố thể hiện với một trong những hình thức sau:
...
Nếu mệnh đề đang cập nhật hoặc không có mặt:
x++;
...
Trong các biểu thức trước:
xv (nếu có) là cả hai biểu thức l-giá trị với vô hướng loại.
...

Vì vậy, khi tôi giải thích điều này một cách chính xác, đoạn mã ngắn sau đây là bất hợp pháp:

int main() 
{ 
    int myCounter = 0; 
    int& reference = myCounter; 

    #pragma omp parallel for 
    for (int i = 0; i < 100; ++i) 
    { 
    #pragma omp atomic 
    reference++; // Increment through reference. 
    } 
    return 0; 
} 

Lý do: Theo this post, một tài liệu tham khảo (đây int& reference) được không phải là một đại lượng vô hướng kiểu. Nhưng tiêu chuẩn nêu rõ rằng nó phải là một, để sử dụng atomic.

Mã biên dịch với g ++, không có bất kỳ cảnh báo nào (-Wall -Wextra).

Câu hỏi của tôi là: Tôi đã hiểu sai tiêu chuẩn hay khái niệm về "loại tham chiếu" của C++? Hoặc hầu hết các trình biên dịch biên dịch mã này, bởi vì nếu không, việc sử dụng atomic bị hạn chế nghiêm trọng (về cơ bản không có dữ liệu nào trên heap có thể là đích của atomic, vì bạn luôn cần tham chiếu hoặc con trỏ bị bỏ qua)?

Trả lời

5

Loại tham chiếu không phải là loại vô hướng. Tuy nhiên, thực tế này không mang về câu hỏi của bạn. Thực tế quan trọng là biểu thức đánh giá tham chiếu đến loại vô hướng một giá trị bằng loại vô hướng. Để cụ thể, biến số reference có loại int& nhưng biểu thức reference có loại int và giá trị danh mục giá trị. Vì vậy, có, chương trình của bạn là phù hợp.

+0

Rất cám ơn vì lời giải thích :) – Gugi

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