Tôi có một thư viện C++, nghĩa vụ phải thực hiện một số phép tính trên nhiều luồng. Tôi đã tạo mã chuỗi độc lập (nghĩa là không có biến được chia sẻ giữa chúng), ngoại trừ một mảng. Vấn đề là, tôi không biết làm thế nào để làm cho nó thread-an toàn.Mảng an toàn không có khóa an toàn
Tôi nhìn vào khóa/mở khóa mutex (QMutex
, khi tôi đang sử dụng Qt), nhưng nó không phù hợp với nhiệm vụ của tôi - trong khi một chủ đề sẽ khóa mutex, các chủ đề khác sẽ đợi!
Sau đó, tôi đọc khoảng std::atomic
, trông giống như những gì tôi cần. Tuy nhiên, tôi cố gắng sử dụng nó theo cách sau:
std::vector<std::atomic<uint64_t>> *myVector;
Và nó tạo ra lỗi biên dịch (sử dụng chức năng xóa 'std :: nguyên tử :: nguyên tử (const std :: nguyên tử &)). Sau đó, tôi tìm thấy the solution - sử dụng wrapper đặc biệt cho std::atomic
. Tôi cố gắng này:
struct AtomicUInt64
{
std::atomic<uint64_t> atomic;
AtomicUInt64() : atomic() {}
AtomicUInt64 (std::atomic<uint64_t> a) : atomic (atomic.load()) {}
AtomicUInt64 (AtomicUInt64 &auint64) : atomic (auint64.atomic.load()) {}
AtomicUInt64 &operator= (AtomicUInt64 &auint64)
{
atomic.store (auint64.atomic.load());
}
};
std::vector<AtomicUInt64> *myVector;
điều này biên dịch thành công, nhưng khi tôi không thể lấp đầy vector:
myVector = new std::vector<AtomicUInt64>();
for (int x = 0; x < 100; ++x)
{
/* This approach produces compiler error:
* use of deleted function 'std::atomic<long long unsigned int>::atomic(const std::atomic<long long unsigned int>&)'
*/
AtomicUInt64 value(std::atomic<uint64_t>(0)) ;
myVector->push_back (value);
/* And this one produces the same error: */
std::atomic<uint64_t> value1 (0);
myVector->push_back (value1);
}
Tôi đang làm gì sai? Tôi cho rằng tôi đã thử tất cả mọi thứ (có thể không, dù sao) và không có gì giúp đỡ. Có cách nào khác để chia sẻ mảng an toàn trong C++ không?
Nhân tiện, tôi sử dụng trình biên dịch 32 bit MinGW 32 bit trên Windows.
Bạn có muốn một mảng có kích thước cố định (phần đa luồng) của _shared elements_ hoặc _shared array_ của phần tử hay không. Tôi có nghĩa là, làm chèn và xóa trong mảng có vị trí trong _multithreaded_ một phần của mã? – Lol4t0
Mảng có kích thước cố định - Tôi không có chèn hoặc xóa trong chuỗi. – ahawkthomas
@ahawkthomas: Bạn push_back, thường thay đổi kích thước ... – PlasmaHH