读书人

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

发布时间: 2013-07-09 09:50:47 作者: rapoo

请教一下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保证这个引用计数能够正常工作,不会混乱,不会少加一,也不会少减一,仅此而以。

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

读书人网 >C++

热点推荐