我真的很感激這方面的一些建議。以線程安全的方式與外部世界共享數據成員
例如
class Foo
{
TData data;
public:
TData *getData() { return &data; } // How can we do this in a thread safe manner ?
};
所以我想有一個機制,使getData()
線程安全。我已經提出了自己的解決方案,它涉及將數據成員打包到以下模板類中,並使用互斥鎖來同步對其的訪問。你怎麼看 ?可能的問題是什麼?
class locked_object : boost::noncopyable
{
T *object;
TLockable *lock;
bool locked;
public:
locked_object(T *_object, TLockable *_lock) : object(_object), lock(_lock), locked(true)
{
lock->lock();
}
~locked_object()
{
lock->unlock();
}
T *get()
{
_ASSERT(locked);
if (!locked)
throw new std::exception("Synchronization error ! Object lock is already released !");
return this->tobject;
}
void unlock()
{
locked = false;
lock->unlock();
}
T *operator ->() const
{
_ASSERT(locked);
if (!locked)
throw new std::exception("Synchronization error ! Object lock is already released !");
return this->tobject;
}
operator T *() const
{
_ASSERT(locked);
if (!locked)
throw new std::exception("Synchronization error ! Object lock is already released !");
return this->tobject;
}
};
感謝您提前發表任何意見和建議。
法提赫
您不需要在縮進的代碼塊中編寫'&gt'(它總是缺少';')。只要寫'>'。 – 2010-12-15 12:40:09
如果您可以獲得副本,請查看Alexandrescu的* Modern C++ Design *。 – 2010-12-15 13:13:19