gpt4 book ai didi

c++ - 删除此保护互斥示例中的定义

转载 作者:行者123 更新时间:2023-11-30 04:33:52 24 4
gpt4 key购买 nike

-edit- 我不能试验 ATM,但今晚会。我在想也许 typedef 可以用来保存 mut 并且可以用来声明一个 var。但我最初的想法是 typedef 不能很好地处理模板,所以我今晚晚些时候必须检查一下(现在,上课)

我在看 this piece of code shown below我想知道如何在不使用定义的情况下实现。

因为我无法编译代码(我目前没有安装任何互斥/多线程库),所以我将只看代码并想一想。

似乎可以通过继承模板类来完全实现PROTECTED_WITH。现在的问题是 PROTECTED_MEMBER。它使用带有## 的名称来创建变量。这不是什么大问题,因为我们创建了一个类,它使用 () 运算符保存变量,使其显示为函数。但是访问 is_held() 是个问题,因为我不想传递 thismut_

我的直觉说开​​箱即用,认为可以在不定义且不向每个变量传递 this、函数 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 );
};

最佳答案

您可以使用包含using 声明的显式特化来列出受互斥锁保护的对象。然后使用基类通过 operator-> 将访问权限“传递”给用户,因此 object->member(使用 object < em>不是是一个指针)执行互斥断言。

做起来比说起来容易:

// Imagine that the members of this class must be locked by the mutex.
class a : public expose_locked_by_arrow< a > {
protected:
int i;
void f();
};

// Declare which members are conditionally locked. Pretty simple and idiomatic.
template<>
struct member_expose< a > : a {
using a::i;
using a::f;
};

#include <iostream>

// Access mutex-locked members with ->
int main() {
a x;
x->i = 5;
a const y( x );
std::cout << y->i << '\n';
}

库代码:

// This template is specialized for each mutex protection client.
template< class >
struct member_expose;

// Base class provides mutex; parameter is derived class (CRTP).
template< class c >
struct expose_locked_by_arrow {
member_expose< c > *
operator->() {
assert ( expose_lock_mutex.is_held() );
return static_cast< member_expose< c > * >( this );
}

member_expose< c > const *
operator->() const {
assert ( expose_lock_mutex.is_held() );
return static_cast< member_expose< c > const * >( this );
}

expose_locked_by_arrow( mutex const &m = mutex() )
: expose_lock_mutex( m ) {}

protected:
mutex expose_lock_mutex;
};

See it run .

关于c++ - 删除此保护互斥示例中的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6348742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com