Tôi có một số mã mà cần phải được thread an toàn và ngoại lệ an toàn. Mã bên dưới là phiên bản rất đơn giản của sự cố của tôi:Khóa một mutex trong một destructor trong C++ 11
#include <mutex>
#include <thread>
std::mutex mutex;
int n=0;
class Counter{
public:
Counter(){
std::lock_guard<std::mutex>guard(mutex);
n++;}
~Counter(){
std::lock_guard<std::mutex>guard(mutex);//How can I protect here the underlying code to mutex.lock() ?
n--;}
};
void doSomething(){
Counter counter;
//Here I could do something meaningful
}
int numberOfThreadInDoSomething(){
std::lock_guard<std::mutex>guard(mutex);
return n;}
Tôi có một mutex mà tôi cần khóa trong trình phá hủy của đối tượng. Vấn đề là destructor của tôi không nên ném ngoại lệ.
Tôi có thể làm gì?
0) Tôi không thể thay thế n
với một biến nguyên tử (tất nhiên nó sẽ làm các trick ở đây nhưng đó không phải là điểm của câu hỏi của tôi)
1) Tôi có thể thay thế mutex của tôi với một spin khóa
2) Tôi có thể thử và bắt khóa vào vòng lặp vô hạn cho đến khi tôi có được khóa mà không có ngoại lệ nào được nêu ra
Không có giải pháp nào hấp dẫn. Bạn có cùng một vấn đề? Bạn đã giải quyết nó như thế nào?
'Tôi có một mutex mà tôi cần phải khóa trong destructor của một đối tượng' - Âm thanh như một ý tưởng tồi. Thay vì cung cấp cho chúng tôi giải pháp và giải quyết vấn đề với chúng tôi, có thể bạn nên cho chúng tôi biết bạn đang cố gắng giải quyết vấn đề gì, vì vậy chúng tôi có thể cung cấp giải pháp tốt hơn. –
@RobertHarvey Điều tôi thực sự muốn làm là chèn các sửa đổi vào bộ nhớ cache dùng chung sau khi chúng được lưu trong cơ sở dữ liệu. – Arnaud