【问题标题】:Cpp thread object and shared_ptr issueCpp 线程对象和 shared_ptr 问题
【发布时间】:2020-10-18 09:48:14
【问题描述】:

当我在这里阅读 cppreference 中的文档时 https://en.cppreference.com/w/cpp/memory/shared_ptr#Example

我想知道打印出来的第一个lp.use_count() 的可能值是多少?我在输出内容中用“

#include 
#include 
#include 
#include 
#include 
 
结构基础
{
    Base() { std::cout  p)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::shared_ptr lp = p; // 线程安全的,即使
                                  // 共享 use_count 递增
    {
        静态 std::mutex io_mutex;
        std::lock_guard<:mutex> lk(io_mutex);
        std::cout  p = std::make_shared();
 
    std::cout 

可能的输出:

Base::Base()
  Derived::Derived()
Created a shared Derived (as a pointer to Base)
  p.get() = 0x2299b30, p.use_count() = 1
Shared ownership between 3 threads and released
ownership from main:
  p.get() = 0, p.use_count() = 0
local pointer in a thread:
  lp.get() = 0x2299b30, lp.use_count() = 5   <<<<<<<< HERE <<<<<<
local pointer in a thread:
  lp.get() = 0x2299b30, lp.use_count() = 3
local pointer in a thread:
  lp.get() = 0x2299b30, lp.use_count() = 2
  Derived::~Derived()
  Base::~Base()
All threads completed, the last one deleted Derived

@user2452809 的回答非常感谢,指出了use_count() 的一个重要特点。

假设use_count() 会返回一个准确的计数,答案是什么?

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    无论如何我都不会依赖那个值。

    在多线程环境下,use_count 返回的值是近似值(典型实现使用 memory_order_relaxed 加载)

    查看参考以获取更多信息:https://en.cppreference.com/w/cpp/memory/shared_ptr/use_count

    【讨论】:

    • 感谢您指出use_count() 的一个重要特性。
    • 为什么 C++ 标准库实现使用 memory_order_relaxed 负载?它不能使用完整的内存屏障吗?
    【解决方案2】:

    我认为它可能是 {4,5,6} 的一个值。我说的对吗?

    问:为什么大于 3?

    A:打印时,至少调用了一个thr函数。包括 main 函数中的引用。 use_count 应该是 3。但是当一个线程休眠一秒钟而另外两个尚未构造时,这是不可能的。 另一方面,如果有两个线程完成,最后一个线程的 use_count 为 3。但由于打印范围内的线程互斥锁,它不会是第一行。

    问:为什么少于 7 个?

    A:因为在子线程休眠期间,主线程会运行p.reset()。一秒钟对 CPU 来说是相当长的时间。

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多