- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在尝试使用 std 原子指针时,我遇到了以下问题。假设我这样做:
std::atomic<std::string*> myString;
// <do fancy stuff with the string... also on other threads>
//A can I do this?
myString.load()->size()
//B can I do this?
char myFifthChar = *(myString.load()->c_str() + 5);
//C can I do this?
char myCharArray[255];
strcpy(myCharArray, myString.load()->c_str());
我很确定 C 是非法的,因为 myString 可能同时被删除。
但是我不确定 A 和 B。我认为它们是非法的,因为在执行读取操作时指针可能会被引用。
但是,如果是这种情况,您怎么能从可能被删除的原子指针中读取数据。由于加载是1步,数据的读取也是1步。
最佳答案
// A can I do this?
myString.load()->size()
是的,您可以,但是如果其他东西可能正在变异或破坏/取消分配 myString< 的快照所指向的
你获得了积分。换句话说,原子检索指针后的情况与多个线程可能具有指针的任何 string
,您确实会遇到竞争条件std::string
对象相同,除了...
原子 load
是否保证对 string
进行某些特定构造/更改的问题 - 可能由更新 myString
的线程执行指向您已经加载
的指针的特定string
实例 - 将对您可见。默认是确保这一点,但你可能想要 read over this explanation memory_order
参数到 load()
。请注意,不显式请求内存同步不会让您免受其他线程的变异/破坏。
因此,假设 myString()
依次指向 string
的 a
、b
,然后是 c
,并且您的代码检索 &b
... 只要 string
b
未发生突变或破坏/取消分配当您调用 size()
时,一切正常。在调用 b
的 之前/期间/之后,
.myString()
可能会更新为指向 c
并不重要>.size()
退一步说,程序可能很难知道在您调用 load()
之后多长时间您可能会尝试取消引用指针,如果 b
对象稍后将被突变或销毁/解除分配,您建议的那种调用不会在围绕后来的突变/销毁的任何同步中进行合作。您显然可以通过多种方式添加此类协调(例如,一些其他原子计数器/标志,使用条件变量通知可能的修改器/析构器/删除器......),或者您有时可能决定接受这样的竞争条件(例如也许如果已知 b
是大容量 LRU 缓存中的最新条目之一)。
如果你正在做一些像围绕一些static const string
实例循环myString
的事情,你不必担心上面所有的突变/破坏的东西(好吧,除非您在 main()
之前/之后访问它们)。
// B can I do this?
char myFifthChar = *(myString.load()->c_str() + 5);
是的,上面有所有警告。
// C can I do this?
char myCharArray[255];
strcpy(myCharArray, myString.load()->c_str());
是的,如上所述(前提是提供的缓冲区足够大)。
I'm pretty sure C is illegal because myString might be deleted in the meantime.
如上所述 - 对于您提到的所有 3 种用途,这种担忧同样有效,只是 C 更有可能因为复制需要更多的 CPU 周期才能完成,而不是取回垃圾值输掉比赛可能会导致缓冲区溢出.
关于c++ - 对 std::atomic::load 的结果使用 Structure dereference(->) 运算符是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30121194/
我正在开发一个小型图书馆,我需要做的一件事是让访问者访问一些数据并返回结果。 在一些较旧的 C++ 代码中,访问者需要声明一个 typedef return_type .例如,boost::stati
我正在尝试使用std:map类型的键和值制作std::any Visual Studio 2017 std::map m("lastname", "Ivanov"); std::cout (m["la
我已经在 C++ 的 map 中声明了一个集合为 std::map> .如何循环访问或打印设定值? 最佳答案 如果你知道如何迭代 std::map或 std::set单独地,您应该可以毫无问题地组合迭
如何循环? 我已经试过了: //----- code std::vector >::iterator it; for ( it = users.begin(); it != users.end();
我有两个用例。 A.我想同步访问两个线程的队列。 B.我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。 对于用例 A,我看到了使用 std::lock_
我正在查看这两种类型特征的文档,但不确定有什么区别。我不是语言律师,但据我所知,它们都适用于“memcpy-able”类型。 它们可以互换使用吗? 最佳答案 不,这些术语不能互换使用。这两个术语都表示
我有以下测试代码,其中有一个参数 fS,它是 ofstream 的容器: #include #include #include #include int
这是这个问题的延续 c++ function ptr in unorderer_map, compile time error 我试图使用 std::function 而不是函数指针,并且只有当函数是
std::unordered_map str_bool_map = { {"a", true}, {"b", false}, {"c", true} }; 我们可以在此映射上使
我有以下对象 std::vector> vectorList; 然后我添加到这个使用 std::vector vec_tmp; vec_tmp.push_back(strDRG); vec_tmp.p
为什么 std::initializer_list不支持std::get<> , std::tuple_size和 std::tuple_element ?在constexpr中用得很多现在的表达式,
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
问题 我正在尝试将 lambda 闭包传递给 std::thread,它使用任意封闭参数调用任意封闭函数。 template std::thread timed_thread(Function&& f
我想创建一个模板类,可以容纳容器和容器的任意组合。例如,std::vector或 std::map ,例如。 我尝试了很多组合,但我必须承认模板的复杂性让我不知所措。我编译的关闭是这样的: templ
我有一个 std::vector>我将其分配给相同类型的第二个 vector 。 我收到这个编译器错误: /opt/gcc-8.2.0/include/c++/8.2.0/bits/stl_algob
有时候,我们有一个工厂可以生成一个 std::unique_ptr vector ,后来我们想在类/线程/你命名的之间共享这些指针。因此,最好改用 std::shared_ptr 。当然有一种方法可以
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 6 年前。 我创建了一个 vector vector ,我想根据我定义的参
我有三个类(class)成员: public: std::vector > getObjects(); std::vector > getObjects() const; privat
我是一名优秀的程序员,十分优秀!