gpt4 book ai didi

c++ - 如何有效地将 std::atomic<> 用于非原始类型?

转载 作者:IT老高 更新时间:2023-10-28 14:02:15 33 4
gpt4 key购买 nike

The definitions for std::atomic<> 似乎对原始类型或 POD 类型显示出明显的用处。

你什么时候会用它来上课?

什么时候应该避免在类里面使用它?

最佳答案

操作std::atomic在任何可简单复制的类型上可用是非常基本的。你可以 build 和摧毁atomic<T> , 你可以询问类型 is_lock_free() ,您可以加载和存储 T 的拷贝,您可以交换 T 的值以各种方式。如果这足以满足您的目的,那么您最好这样做而不是持有显式锁定。

如果这些操作还不够,例如,如果您需要直接对值自动执行序列操作,或者如果对象足够大以至于复制成本很高,那么您可能希望持有显式锁您设法实现更复杂的目标或避免做所有使用 atomic<T> 的拷贝会涉及到。

// non-POD type that maintains an invariant a==b without any care for
// thread safety.
struct T { int b; }
struct S : private T {
S(int n) : a{n}, b{n} {}
void increment() { a++; b++; }
private:
int a;
};

std::atomic<S> a{{5}}; // global variable

// how a thread might update the global variable without losing any
// other thread's updates.
S s = a.load();
S new_s;
do {
new_s = s;
new_s.increment(); // whatever modifications you want
} while (!a.compare_exchange_strong(s, new_s));

如您所见,这基本上是获取值的拷贝,修改拷贝,然后尝试将修改后的值复制回来,必要时重复。您对拷贝所做的修改可以随心所欲地复杂化,而不仅限于单个成员函数。

关于c++ - 如何有效地将 std::atomic<> 用于非原始类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13885617/

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