Tôi có một lớp ConcurrentQueue
đó là dựa trên một người dùng cung cấp container với một constructor như thế này ...Làm cách nào để khóa một mutex trong danh sách bộ khởi tạo?
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue) {}
Nhưng, tôi cần phải khóa other
's mutex trong khi nó đang được sao chép.
Lựa chọn 1:
Vì vậy, tôi có thể không sử dụng các nhà xây dựng bản sao nào cả, và làm ...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue)
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
m_Queue = other.m_Queue;
}
Nhưng tôi không thể đảm bảo rằng nhiệm vụ sao chép và sao chép xây dựng tương đương chức năng.
Phương án 2:
tôi có thể có một phương pháp riêng ...
std::queue<T, Container> GetQueue() const
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
return m_Queue;
}
Và sau đó trong các nhà xây dựng làm điều này ...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.GetQueue()) {}
Nhưng điều này có khả năng (tùy thuộc vào việc tối ưu hóa) sử dụng hàm tạo bản sao của m_Queue một lần và nó là hàm tạo di chuyển một lần. Và tôi cũng không thể đảm bảo rằng bản sao và di chuyển tương đương với một bản sao. Ngoài ra, thùng chứa do người dùng cung cấp có thể kỳ quái và có thể sao chép được nhưng không thể điều khiển được, điều này cũng sẽ khiến phương pháp này gặp sự cố.
Vì vậy, tôi phải làm gì?
Bạn có nghĩ rằng nó luôn luôn được thực hiện theo cách này không? – 0x499602D2
@ 0x499602D2 Thực ra, tôi nghĩ rằng tình huống nên tránh. Tôi không biết đủ bối cảnh thực tế của bạn, hoặc vấn đề bạn đang cố gắng giải quyết, để đề xuất các giải pháp thay thế, nhưng tôi biết rằng tôi chưa bao giờ phải thực sự sử dụng một cái gì đó như thế này. Trong thực tế, tôi không thể thực sự nghĩ về một trường hợp mà tôi đã sao chép một container giữa các chủ đề. –