首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问一下boost:shared_ptr的线程安全有关问题

2013-07-09 
请教一下boost::shared_ptr的线程安全问题本帖最后由 guolisen 于 2013-06-26 18:31:41 编辑请教一下boost

请教一下boost::shared_ptr的线程安全问题
本帖最后由 guolisen 于 2013-06-26 18:31:41 编辑 请教一下boost::shared_ptr的线程安全问题

看了一下boost的官网关于shared_ptr线程安全的那一小结,

http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety

前面提到的那几个线程安全需要注意的地方,后面则说在1.33版本之后加入了lock-free,这个意思是1.33版本以后都是线程安全的不需要注意前面的那几个例子吗?

感觉有些歧义我按他说的写了些例子,虽然有崩溃的情况但都是new的时候出现错误(new的太频繁),貌似和线程没关系,所以求教。


#include <cstdlib>  
#include <iostream>  
#include <time.h>  
#include <stdio.h> 
#include <winsock2.h>
#include <windows.h>
#include <process.h>
#include <iostream>
#include <boost/shared_ptr.hpp>
boost::shared_ptr<int> p(new int(42));


unsigned int __stdcall threadfunA(void* arg)
{
while(1)
{
p.reset(new int(1));
Sleep(1);
}
return 0;
}

unsigned int __stdcall threadfunB(void* arg)
{
while(1)
{
p.reset(new int(1));
Sleep(1);
}
return 0;
}


int main()
{
    HANDLE client;
    client = (HANDLE) _beginthreadex (NULL, 0,
    threadfunA, 0, 0 , NULL);
    if (client == 0) {
        printf ("error1 in _beginthreadex\n");
        return -1;
    }

    HANDLE client2;
    client2 = (HANDLE) _beginthreadex (NULL, 0,
    threadfunB, 0, 0 , NULL);
    if (client2 == 0) {
        printf ("error2 in _beginthreadex\n");
        return -1;
    }

    system("pause");
    return 0;
}


shared_ptr?线程安全
------解决方案--------------------


shared_ptr只是内部的引用计数是线程安全的.

其他状况, 自己考虑一下就知道了.

一个shared_ptr里有一个引用计数, 有一个对象指针, 针对这两个东西分别操作, 那么不是原子的, 自然不是线程安全的.

其实很简单, 你操作同一个shared_ptr, 自然会面临并发操作对象指针的风险, 光这一点, 你的代码就必须是错的, 因为你Reset明确的操作了同一个shared_ptr的对象指针.
[解决办法]
shared_ptr是线程安全的,这个意思并不是说你可以安全地在多个线程中同时操作同一个shared_ptr<T>变量,而是说你可以把一个shared_ptr赋值给两个变量,分别被两个线程使用。虽然是两个变量,但它们指向同一个对象,拥有同一个引用计数,这里shared_ptr保证这个引用计数能够正常工作,不会混乱,不会少加一,也不会少减一,仅此而以。

它不保证存储它的变量可以并发访问,这应该由它的使用者保证;它也不保证它存储的对象可以并发访问,这要由对象本身负责,它只保证一点,就是它的引用计数操作是原子操作。

热点排行