在C ++线程中,我应该按值或引用传递shared_ptr吗?

塑料格罗夫

微软说,即使有多个副本共享同一对象,也应使用此页面上的“线程安全”shared_ptr

那么这是否意味着以下两个条件都可以接受?我都尝试过,它们似乎工作正常。

编辑:实际的业务目标是从长时间运行的线程到主线程获取字符串更新。我想应该使用,shared_ptr因为string它不是线程安全的。不要老实地在乎所有权。

选项1(通过参考):

auto status = std::make_shared<std::string>();
auto f = [&status]() {
    ...
  *status = "current status";
    ...
};

std::thread t{f};

while(true) {
  std::cout << *status << std::endl;
  std::this_thread::sleep_for(1000ms);
  if (*status == "completed") break;
}

t.join();

选项2(制作副本):

auto status = std::make_shared<std::string>();
auto f = [](std::shared_ptr<std::string> s) {
    ...
  *s= "current status";
    ...
};

std::thread t{f, status};

while(true) {
  std::cout << *status << std::endl;
  std::this_thread::sleep_for(1000ms);
  if (*status == "completed") break;
}

t.join();

EDIT2:显然,这两种方法对于我要实现的目标都是错误的。我需要使用std::mutexcppreference)而不是与之混为一谈shared_ptr请参阅此答案的下半部分

埃雷里卡

通常,线程可能会超出创建它们的作用域。在这种情况下,在线程仍在运行时,可能会破坏通过引用捕获的任何局部变量。如果是这种情况,那么您不应通过引用进行捕获。

此外,在一个线程中修改共享指针对象并在不同步的情况下访问另一个线程会导致未定义的行为。如果这是您要执行的操作,则应使用std::atomic_load/atomic_store函数访问该指针,或仅将指针复制到每个线程中。请注意,您可以通过副本捕获:

auto f = [status]() {

此外,共享指针不提供额外的线程安全性来访问所指向的对象,除了保持所有权有效并确保将其删除一次即可。如果指定的类型不是原子类型,则在一个线程中对其进行修改并在不同步的情况下访问另一个线程将导致未定义的行为。如果这是您要执行的操作,则需要使用互斥锁或类似方法。或将指向对象本身复制到每个线程中。

关于已编辑的问题:您的示例适用于后一种情况。他们两个都有不确定的行为。您需要同步。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++线程中,我应该按值或引用传递shared_ptr吗?

来自分类Dev

在C#中,我应该按值传递参数并返回相同的变量,还是按引用传递?

来自分类Dev

我是否正确理解C中的按值传递和按引用传递?

来自分类Dev

C ++ Shared_Ptr不共享吗?

来自分类Dev

传递 std::shared_ptr 作为对 lambda 捕获列表的引用(C++)

来自分类Dev

在C ++中按值传递指针吗?

来自分类Dev

C ++中的函数重载按值或按引用传递参数

来自分类Dev

我应该在C ++的类中存储引用吗?

来自分类Dev

const引用何时比C ++ 11中的按值传递更好?

来自分类Dev

C ++-shared_ptr的数组

来自分类Dev

有人可以解释一下C#中的“按值传递”和“按引用传递”是什么意思吗?

来自分类Dev

对在C#中按引用传递和按值传递感到困惑

来自分类Dev

C ++中按引用传递和按值传递之间过载歧义的可行解决方案

来自分类Dev

C:何时按值返回或传递引用

来自分类Dev

C ++是否按值或引用传递对象?

来自分类Dev

C++ 中 std::shared_ptr 数组的工作原理

来自分类Dev

Objective-C是按值传递还是按引用传递?

来自分类Dev

C#按值传递与按引用传递

来自分类Dev

Python,Java,C:按引用传递或按值传递

来自分类Dev

c#对象按引用传递或按值传递

来自分类Dev

C按值传递数组vs按引用传递数组

来自分类Dev

c#对象按引用传递或按值传递

来自分类Dev

哪个更快?按引用传递与按值传递C ++

来自分类Dev

C ++入门5版:从uniqe_ptr初始化了shared_ptr吗?

来自分类Dev

C#是按值传递对象吗?

来自分类Dev

C#是按值传递对象吗?

来自分类Dev

C ++中按引用传递对象错误

来自分类Dev

在C中按指针传递/按引用传递

来自分类Dev

与C ++相比,我对C#中的按引用传递工作方式是否正确?

Related 相关文章

  1. 1

    在C ++线程中,我应该按值或引用传递shared_ptr吗?

  2. 2

    在C#中,我应该按值传递参数并返回相同的变量,还是按引用传递?

  3. 3

    我是否正确理解C中的按值传递和按引用传递?

  4. 4

    C ++ Shared_Ptr不共享吗?

  5. 5

    传递 std::shared_ptr 作为对 lambda 捕获列表的引用(C++)

  6. 6

    在C ++中按值传递指针吗?

  7. 7

    C ++中的函数重载按值或按引用传递参数

  8. 8

    我应该在C ++的类中存储引用吗?

  9. 9

    const引用何时比C ++ 11中的按值传递更好?

  10. 10

    C ++-shared_ptr的数组

  11. 11

    有人可以解释一下C#中的“按值传递”和“按引用传递”是什么意思吗?

  12. 12

    对在C#中按引用传递和按值传递感到困惑

  13. 13

    C ++中按引用传递和按值传递之间过载歧义的可行解决方案

  14. 14

    C:何时按值返回或传递引用

  15. 15

    C ++是否按值或引用传递对象?

  16. 16

    C++ 中 std::shared_ptr 数组的工作原理

  17. 17

    Objective-C是按值传递还是按引用传递?

  18. 18

    C#按值传递与按引用传递

  19. 19

    Python,Java,C:按引用传递或按值传递

  20. 20

    c#对象按引用传递或按值传递

  21. 21

    C按值传递数组vs按引用传递数组

  22. 22

    c#对象按引用传递或按值传递

  23. 23

    哪个更快?按引用传递与按值传递C ++

  24. 24

    C ++入门5版:从uniqe_ptr初始化了shared_ptr吗?

  25. 25

    C#是按值传递对象吗?

  26. 26

    C#是按值传递对象吗?

  27. 27

    C ++中按引用传递对象错误

  28. 28

    在C中按指针传递/按引用传递

  29. 29

    与C ++相比,我对C#中的按引用传递工作方式是否正确?

热门标签

归档