【发布时间】:2013-05-15 15:20:54
【问题描述】:
我有一些代码需要线程安全和异常安全。下面的代码是我的问题的一个非常简化的版本:
#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) 我可以尝试将锁定捕获到一个无限循环中,直到我最终获得锁定而没有引发异常
这些解决方案似乎都不是很吸引人。你有同样的问题吗?你是怎么解决的?
【问题讨论】:
-
I have a mutex that I need to lock in the destructor of an object-- 听起来是个坏主意。与其向我们提供解决方案并让我们用它来解决问题,不如告诉我们您要解决什么问题,以便我们提供更好的解决方案。 -
@RobertHarvey 我真正想做的是将修改保存在数据库中后插入共享缓存。
标签: c++ thread-safety destructor raii exception-safety