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

guolisen 2013-06-26 06:30:47
请教一下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;
}


...全文
284 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
guolisen 2013-06-27
  • 打赏
  • 举报
回复
引用 2 楼 plainsong 的回复:
shared_ptr是线程安全的,这个意思并不是说你可以安全地在多个线程中同时操作同一个shared_ptr<T>变量,而是说你可以把一个shared_ptr赋值给两个变量,分别被两个线程使用。虽然是两个变量,但它们指向同一个对象,拥有同一个引用计数,这里shared_ptr保证这个引用计数能够正常工作,不会混乱,不会少加一,也不会少减一,仅此而以。 它不保证存储它的变量可以并发访问,这应该由它的使用者保证;它也不保证它存储的对象可以并发访问,这要由对象本身负责,它只保证一点,就是它的引用计数操作是原子操作。
谢谢二位,那个程序是写2了,多谢:)
guolisen 2013-06-27
  • 打赏
  • 举报
回复
引用 1 楼 qq120848369 的回复:
shared_ptr只是内部的引用计数是线程安全的. 其他状况, 自己考虑一下就知道了. 一个shared_ptr里有一个引用计数, 有一个对象指针, 针对这两个东西分别操作, 那么不是原子的, 自然不是线程安全的. 其实很简单, 你操作同一个shared_ptr, 自然会面临并发操作对象指针的风险, 光这一点, 你的代码就必须是错的, 因为你Reset明确的操作了同一个shared_ptr的对象指针.
谢谢二位,那个程序是写2了,多谢:)
短歌如风 2013-06-26
  • 打赏
  • 举报
回复
shared_ptr是线程安全的,这个意思并不是说你可以安全地在多个线程中同时操作同一个shared_ptr<T>变量,而是说你可以把一个shared_ptr赋值给两个变量,分别被两个线程使用。虽然是两个变量,但它们指向同一个对象,拥有同一个引用计数,这里shared_ptr保证这个引用计数能够正常工作,不会混乱,不会少加一,也不会少减一,仅此而以。 它不保证存储它的变量可以并发访问,这应该由它的使用者保证;它也不保证它存储的对象可以并发访问,这要由对象本身负责,它只保证一点,就是它的引用计数操作是原子操作。
qq120848369 2013-06-26
  • 打赏
  • 举报
回复
shared_ptr只是内部的引用计数是线程安全的. 其他状况, 自己考虑一下就知道了. 一个shared_ptr里有一个引用计数, 有一个对象指针, 针对这两个东西分别操作, 那么不是原子的, 自然不是线程安全的. 其实很简单, 你操作同一个shared_ptr, 自然会面临并发操作对象指针的风险, 光这一点, 你的代码就必须是错的, 因为你Reset明确的操作了同一个shared_ptr的对象指针.

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧