删除此安全保护互斥示例中的定义
|
-编辑-我不能尝试自动柜员机,但今晚会。我想也许typedef可以用来保存mut并可以用来声明var。但是我最初的想法是typedef不能很好地与模板配合使用,所以我今晚必须检查一下(目前,要上课)
我正在查看下面显示的这段代码,我想知道如果不使用定义怎么可能实现。
由于我无法编译代码(我目前未安装任何互斥锁/多线程库),因此我只会看一下代码并仔细考虑。
似乎可以通过继承模板类来完全实现“ 0”。现在的问题是
PROTECTED_MEMBER
。它使用带有##的名称来创建变量。这不是什么大问题,因为我们创建了一个类,该类使用()
运算符保存该变量,以使其作为函数出现。但是访问is_held()
问题,因为我不想传入not4ѭ或mut_
。
我的直截了当地说,开箱即用的想法是可以解决这个问题,而无需定义,也不必传入每个变量,函数ptr或引用。我将允许所有人作弊并使用c ++ 0x功能。
template<typename Mutex>
class TestableMutex {
public:
void lock() { m.lock(); id = this_thread::get_id(); }
void unlock() { id = 0; m.unlock(); }
bool try_lock() { bool b = m.try_lock();
if( b ) id = this_thread::get_id();
return b; }
bool is_held() { return id == this_thread::get_id(); }
private:
Mutex m;
atomic<thread::id> id;
// for recursive mutexes, add a count
};
#define PROTECTED_WITH(MutType) \\
public: void lock() { mut_.lock(); } \\
public: bool try_lock() { return mut_.try_lock(); } \\
public: void unlock() { mut_.unlock(); } \\
private: TestableMutex<MutType> mut_;
#define PROTECTED_MEMBER(Type,name) \\
public: Type& name() { assert(mut_.is_held()); return name##_; } \\
private: Type name##_;
struct MyData {
PROTECTED_WITH( some_mutex_type );
PROTECTED_MEMBER( vector<int>, v );
PROTECTED_MEMBER( Widget*, w );
};
没有找到相关结果
已邀请:
2 个回复
缕嚏冻
将访问“传递”给用户,因此
(
不是指针)执行互斥量声明。 这比说起来容易:
库代码:
看到它运行。
坝硷操
它使用operator->()技巧(当operator->不返回指针类型时,编译器将继续对返回的值调用operator->,直到最终返回常规指针类型为止)并给出以下输出:
通常来说,需要多个线程使用的对象不应像这样暴露其内部,让它接受参数并使用其内部值对它们进行操作会更安全。