可变关键字和线程安全

发布于 2024-10-13 10:01:11 字数 706 浏览 8 评论 0原文

我有一个抽象基类,

class Map {
  public:
    virtual Value get(Key const &) const;
};

一个来自外部库的数据库类

class Database {
  public:
    // logically const and thread-safe
    Value get(Key const &key);
};

实现开始

class PersistentMap : public Map {
    Database db;

  public:
    Value get(Key const &key) const
    { return const_cast<Database &>(db).get(key); }
};

,我从一个像 const_cast 的数量开始超出范围的 ,我通过添加一个 mutable< /code> 说明符到 PersistentMap::db (以及一条提醒自己它丑陋的注释)。

  1. 我第一次尝试 const_cast 是线程安全的吗?
  2. 我的新方法是线程安全的,还是应该将 db 标记为 易失性

I have an abstract base class

class Map {
  public:
    virtual Value get(Key const &) const;
};

a database class from an external library

class Database {
  public:
    // logically const and thread-safe
    Value get(Key const &key);
};

and I started with an implementation like

class PersistentMap : public Map {
    Database db;

  public:
    Value get(Key const &key) const
    { return const_cast<Database &>(db).get(key); }
};

As the number of const_casts grew beyond bounds, I got rid of them by adding a mutable specifier to PersistentMap::db (and a comment to remind myself of its ugliness).

  1. Was my first attempt with const_cast thread-safe?
  2. Is my new approach thread-safe, or should db also be marked volatile?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深者入戏 2024-10-20 10:01:11

这完全取决于 Database::get 是否是线程安全的。如果它包含阻止并发访问的锁,或者对于并发访问是安全的,那么您的代码可以使用 const_cast 或 mutable。使用 volatile 是完全无关的。

It depends entirely on whether Database::get is thread-safe or not. If it contains locks to prevent concurrent access, or is otherwise safe for concurrent access, then your code is fine with either the const_cast or the mutable. Using volatile is completely irrelevant.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文