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:
x
vàv
(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)?
Rất cám ơn vì lời giải thích :) – Gugi