2013-10-17 16 views
5
array< atomic_size_t, 10 > A; 

Không atomic_init(A,{0}) cũng không phải A = {ATOMIC_VAR_INIT(0)} dường như hoạt động, trả về lỗi không thể hiểu được. Làm thế nào bạn sẽ khởi tạo một mảng nguyên tử để 0s?C++ - Cách khởi tạo một mảng nguyên tử?

Ngay cả đối với các vòng cập nhật một phần tử của mảng ở mỗi bước không hoạt động. Mục đích của mảng nguyên tử là gì nếu chúng ta không thể khởi tạo chúng?

Tôi cũng muốn thêm rằng kích thước thực tế của mảng của tôi là rất lớn (không phải 10 như trong ví dụ), vì vậy tôi sẽ cần một khởi tạo trực tiếp.

Trả lời

2
std::array<atomic_size_t, 10> arr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 

hoặc nếu bạn có thể biên dịch cho C++ 11

std::array<atomic_size_t, 10> arr{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; // double braces required 

Edit:

Nó chỉ xảy ra với tôi rằng bạn đang cố gắng để lưu trữ Atomics, mà không phải là copyable, vào một bộ sưu tập yêu cầu chúng có thể sao chép được (Lưu ý: Tôi không thể lấy bản sao của tiêu chuẩn vào lúc này. Tôi biết điều này đúng với các bộ sưu tập khác, nhưng tôi không chắc liệu nó có đúng với số std::array).

Một vấn đề tương tự đã được đăng trong một thời gian trở lại: Thread-safe lock-free array

+0

Ok, nhưng tôi đặt 10 làm ví dụ. Trên thực tế, tôi nên khởi tạo mảng của tôi với một số lượng lớn các số không. – Pippo

+0

Vậy thì không thể có một tập hợp các biến nguyên tử ?! o.O – Pippo

+0

Sắp xếp. Bạn phải nhảy qua một vài vòng nhỏ. Câu hỏi SO khác có ví dụ về cách thực hiện. –

2
std::array<std::atomic<std::size_t>, 100> A; 
for(auto&x:A) 
    std::atomic_init(&x,std::size_t(0)); 

hiện công việc sử dụng

clang++ -std=c++11 -stdlib=libc++ -Weverything -Wno-c++98-compat 

sử dụng kêu vang-3.3. Tôi cũng đã thử với gcc 4.8, nhưng nó không hỗ trợ std::atomic_init(). Tuy nhiên, tôi cho rằng bạn có thể thay thế std::atomic_init(&x,std::size_t(0)) bằng x=std::size_t(0).

Lưu ý rằng std::atomic<> không thể sao chép được, vi phạm một số phương pháp chứa (bao gồm cả việc xây dựng std::array<std::atomic<T>> từ một số T). Ngoài ra, việc lưu trữ nguyên tử trong một mảng có thể gây ra việc chia sẻ sai sai, ảnh hưởng đến hiệu suất.

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