我有一些代码需要线程安全和异常安全。下面的代码是我的问题的一个非常简化的版本:
#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;}
我有一个互斥体,需要锁定对象的析构函数。问题是我的析构函数不应该抛出异常。
我能做些什么 ?
0)我不能n
用原子变量替换(当然在这里可以解决问题,但这不是我的问题的重点)
1)我可以用自旋锁替换我的互斥锁
2)我可以尝试将锁定捕获到一个无限循环中,直到我最终获得锁定而没有引发异常
这些解决方案似乎都不是很吸引人。你有同样的问题吗?你是怎么解决的?