gpt4 book ai didi

c++ - volatile 可能是用户定义的类型,以帮助编写线程安全的代码

转载 作者:IT老高 更新时间:2023-10-28 12:58:18 26 4
gpt4 key购买 nike

我知道,在之前的几个问题/答案中已经非常清楚,volatile 与 c++ 内存模型的可见状态有关,而不是与多线程有关。

另一方面,这个 article Alexandrescu 使用 volatile 关键字不是作为运行时功能,而是作为编译时检查来强制编译器无法接受可能不是线程安全的代码。在文章中,关键字的使用更像是 required_thread_safety 标签,而不是 volatile 的实际预期用途。

volatile 的这种(ab)使用是否合适?该方法中可能隐藏了哪些可能的问题?

首先想到的是增加了困惑:volatile 与线程安全无关,但由于缺乏更好的工具,我可以接受它。

文章基本简化:

如果你声明了一个变量volatile,则只能在其上调用volatile成员方法,所以编译器会阻塞调用其他方法的代码。将 std::vector 实例声明为 volatile 将阻止对该类的所有使用。添加一个锁定指针形状的包装器,执行 const_cast 以释放 volatile 要求,将允许通过锁定指针进行任何访问。

从文章中窃取:

template <typename T>
class LockingPtr {
public:
// Constructors/destructors
LockingPtr(volatile T& obj, Mutex& mtx)
: pObj_(const_cast<T*>(&obj)), pMtx_(&mtx)
{ mtx.Lock(); }
~LockingPtr() { pMtx_->Unlock(); }
// Pointer behavior
T& operator*() { return *pObj_; }
T* operator->() { return pObj_; }
private:
T* pObj_;
Mutex* pMtx_;
LockingPtr(const LockingPtr&);
LockingPtr& operator=(const LockingPtr&);
};

class SyncBuf {
public:
void Thread1() {
LockingPtr<BufT> lpBuf(buffer_, mtx_);
BufT::iterator i = lpBuf->begin();
for (; i != lpBuf->end(); ++i) {
// ... use *i ...
}
}
void Thread2();
private:
typedef vector<char> BufT;
volatile BufT buffer_;
Mutex mtx_; // controls access to buffer_
};

注意

在出现前几个答案后,我想我必须澄清一下,因为我可能没有使用最合适的词。

volatile 的使用不是因为它在运行时提供了什么,而是因为它在编译时意味着什么。也就是说,如果 const 关键字在用户定义类型中很少使用,就像 volatile 一样,也可以使用相同的技巧。也就是说,有一个关键字(恰好拼写为 volatile)允许我阻止成员函数调用,而 Alexandrescu 正在使用它来欺骗编译器,使其无法编译线程不安全的代码。

我认为它存在许多元编程技巧,这些技巧不是因为它们在编译时做了什么,而是因为它迫使编译器为你做些什么。

最佳答案

我认为问题不在于 volatile 提供的线程安全。它并没有,Andrei 的 文章也没有说它有。在这里,一个 mutex 用于实现这一点。问题是,使用 volatile 关键字来提供 static 类型检查 以及使用 mutex 来提供线程安全代码是否属于滥用volatile 关键字?恕我直言,这很聪明,但我遇到了一些开发人员,他们不喜欢严格类型检查

当您为多线程环境编写代码时,IMO 已经足够谨慎地强调您希望人们不要忽视竞争条件和死锁。

这种包装方法的一个缺点是,对使用 LockingPtr 包装的类型的每个操作都必须通过成员函数。这将增加一层间接性,这可能会极大地影响开发人员在团队中的舒适度。

但如果你是一个相信 C++ 精神的纯粹主义者,也就是 严格类型检查;这是一个不错的选择。

关于c++ - volatile 可能是用户定义的类型,以帮助编写线程安全的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491495/

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