相关疑难解决方法(0)

std :: shared_ptr线程安全

我读过这个

"多个线程可以同时读写不同的shared_ptr对象,即使这些对象是共享所有权的副本." (MSDN:标准C++库中的线程安全性)

这是否意味着更改shared_ptr对象是安全的?
例如,下一个代码是安全的:

shared_ptr<myClass> global = make_shared<myClass>();
...

//In thread 1
shared_ptr<myClass> private = global;
...

//In thread 2
global = make_shared<myClass>();
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以确定线程1 private将具有global线程2分配的原始值或新值,但无论哪种方式,它将具有对myClass的有效shared_ptr?

==编辑==
只是为了解释我的动机.我想有一个共享指针来保存我的配置,我有一个线程池来处理请求.全局配置也是
如此global.
thread 1在开始处理请求时采用当前配置.
thread 2正在更新配置.(仅适用于未来的请求)

如果它工作,我可以更新配置,而不会在请求处理过程中中断它.

c++ std shared-ptr

43
推荐指数
3
解决办法
4万
查看次数

关于weak_ptr的线程安全性

std::shared_ptr<int> g_s = std::make_shared<int>(1);
void f1()
{
    std::shared_ptr<int>l_s1 = g_s; // read g_s
}

void f2()
{
    std::shared_ptr<int> l_s2 = std::make_shared<int>(3);
    std::thread th(f1);
    th.detach();
    g_s = l_s2; // write g_s
}
Run Code Online (Sandbox Code Playgroud)

关于上面的代码,我知道不同的线程读取和写入相同的shared_ptr导致竞争条件.但是怎么样weak_ptr?下面的代码中是否有竞争条件?(我的平台是Microsoft VS2013.)

std::weak_ptr<int> g_w;

void f3()
{
    std::shared_ptr<int>l_s3 = g_w.lock(); //2. here will read g_w
    if (l_s3)
    {
        ;/.....
    }
}

void f4()
{
    std::shared_ptr<int> p_s = std::make_shared<int>(1);
    g_w = p_s;

    std::thread th(f3);
    th.detach();
    // 1. p_s destory will motify g_w (write g_w)
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading weak-ptr c++11

15
推荐指数
3
解决办法
7941
查看次数

使用智能指针的C++链接列表

我只使用链接列表的原始指针和模板.例如,成员数据,Node<T>* head;当我插入节点时,其中一行是head = new Node<T>(data);.

但是,现在我需要使用智能指针,我不知道如何更改它以使用智能指针.会员数据是否会更改为shared_ptr<Node<T>> head;,另一行会更改为
head = shared_ptr<Node<T>>( new <Node<T>>(data) );

c++ templates pointers linked-list

8
推荐指数
2
解决办法
7018
查看次数

是std :: thread的共享指针是一种不好的做法?

使用std :: shared_ptr <std :: thread>是否有意义?逻辑很简单:如果不需要线程,删除它,如果需要new,则重新定位它.有没有办法将这个概念与汇集线程进行比较?

我确实知道我系统中线程的确切数量(我开发了图像处理算法,我想给每个"算法"类的子项一个单独的线程(也许是为了私有,然后不需要shared_ptr),这个算法将运行,如果没有提供图像,则将此私有线程空闲.这是一个坏概念吗?

c++ multithreading c++11

5
推荐指数
1
解决办法
430
查看次数

为什么 std::shared_ptr 中的计数器是原子的?

_Sp_counted_base使用原子计数器的实现:

_Atomic_word  _M_use_count;     // #shared
_Atomic_word  _M_weak_count;    // #weak + (#shared != 0)
Run Code Online (Sandbox Code Playgroud)

为什么计数器是原子的而指针不是?原子计数有必要吗?有没有例子说明其必要性?

(因为std::shared_ptr不是线程安全的,所以我认为原子计数是没有必要的。)

c++ shared-ptr

1
推荐指数
1
解决办法
403
查看次数