社区
进程/线程/DLL
帖子详情
多个线程delete同一个指针
World7th
2009-02-26 12:35:40
当多个线程获取了同一指针之后,我只需要delete一次,怎么做
...全文
430
32
打赏
收藏
多个线程delete同一个指针
当多个线程获取了同一指针之后,我只需要delete一次,怎么做
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
32 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
KHacker_001
2009-03-03
打赏
举报
回复
这个技巧不错 谢谢了
_microsoft
2009-03-03
打赏
举报
回复
以为计数和同步就是最科学的解决办法了,原来还有智能指针这一说。得多学习一下。
nieoding
2009-03-03
打赏
举报
回复
智能指针是正解
自己用计数及线程同步锁去维护,是一件技术难度很大而且危险的事情
推荐使用boost::shared_ptr
lzg0001
2009-03-02
打赏
举报
回复
[Quote=引用 2 楼 fandh 的回复:]
必须要用临界变量!不然,很容易出现重复删除!
[/Quote]
if(p) {delete p; p = NULL}
并不能保证运行的正确,三个指令块间被分隔执行的机率很大.
龙凤呈祥焱
2009-03-02
打赏
举报
回复
有个重要的问题要注意:
你在多线程中访问这个指针时。是使用的同一个变量还是每一个线程都有一个变量来保存这个指针
1。如果是同一个变量。那只要访问前做同步。然后置为0,就OK。
2.如果每个线程都保存了一个指针。那就有问题了。
假设A。B两个线程。此是无论是否同步。在A中调用delete是没问题。能正常释放。但对A的指针做置0是,只影响A线程的这个变量。B线程内的变量仍然指身已经释放的内存。此时如果仅仅使用if(p)的方式。B中仍然会执行delete p,这就造成了重复释放。在DEBUG版本中。就报错。
如果出现2中的问题。可以考虑传递二级指针。即将p的指针传递到各线程。释放时先同步,再判断if( *p ),如果不为空则:delete *p;*p=NULL;应该比维护引用计数方便
World7th
2009-03-02
打赏
举报
回复
其实我问的问题是多个线程同时取到了同一个指针,当delete这个指针的时候,每个线程中,这个指针值是指向同一个地址的,所以即使加了同步也会出错,应该再加上引用计数才对.
World7th
2009-03-02
打赏
举报
回复
其实我问的问题是多个线程同时取到了同一个指针,当delete这个指针的时候,每个线程中,这个指针值是指向同一个地址的,所以即使加了同步也会出错,应该再加上引用计数才对.
invaliddescriptor
2009-03-02
打赏
举报
回复
友情up
僵哥
2009-03-02
打赏
举报
回复
[Quote=引用 13 楼 kylixfire 的回复:]
还有就是要注意。在动态库中new的对象。在exe或者其他动态库中不能delete除非使用GlobalAlloc和GlobalFree
[/Quote]
在没有重载new操作符的情况下,基本上调用的是同一个msvcrt.dll当中的函数,所以并不会影响在同一个进程当中的delete操作。
World7th
2009-03-02
打赏
举报
回复
to aaronwang81
问题是现在多线程确实会出现2的情况,我采用了引用计数的办法解决了,你的办法在某些问题上是可行的.出现问题2的实际例子就是:iocp的工作线程会有可能得到相同的单句柄数据指针,释放时就会有问题.
World7th
2009-03-02
打赏
举报
回复
to aaronwang81
问题是现在多线程确实会出现2的情况,我采用了引用计数的办法解决了,你的办法在某些问题上是可行的.实际例子就是:iocp的工作线程会有可能得到相同的单句柄数据指针,释放时就会有问题.
SKJG
2009-03-01
打赏
举报
回复
Solution1
使用智能指针,不需要考虑删除问题
比如Boost中的SharedPtr就是一个很好的实现
Solution2
比如线程A/B/C
A负责删除,B/C使用
给指针加一个锁对象(比如Critical Section/Mutex)
三个线程在使用指针前都要先获得锁。
A要删除时,先获得锁,释放空间,把指针赋值为NULL
B/C要使用前,都先获得锁,之后判定是否为NULL,然后再使用。
ahao
2009-03-01
打赏
举报
回复
别用原始指针,用智能指针,多简单
---
http://www.chrometalking.com/
cnyu
2009-03-01
打赏
举报
回复
在每个线程中:
进入代码保护
指针不为空
{
删除指针
指针为空
}
离开代码保护
laowang2
2009-02-28
打赏
举报
回复
forcal
2009-02-28
打赏
举报
回复
1、必须使用线程同步,优先考虑用临界变量进行同步。
2、使用指针前或delete 前先判断指针是否有效,delete 后如果指针未申请内存,必须赋值为NULL。
3、对指针的任何操作必须在同步区进行。
北京的雾霾天
2009-02-26
打赏
举报
回复
delete多次好像没有问题的啊。
wuyu637
2009-02-26
打赏
举报
回复
delete 之后
赋值为null,
其他的线程delete之前判断是否为null
fandh
2009-02-26
打赏
举报
回复
必须要用临界变量!不然,很容易出现重复删除!
oyljerry
2009-02-26
打赏
举报
回复
delete p;
p = NULL;
其他线程释放前 if(p)判断一下
加载更多回复(11)
C++11内存管理和多
线程
编程
1、第一板块:内存管理: 1、实用动态内存的优势:不同的对象函数之间可以共享使用一个内存区域。 2、每一个New都有一个与之对应的
delete
进行释放。 3、new 和malloc的区别在于new不但分配了内存还同时创建对象,而malloc只负责分配内存。 4、直接声明数组和声明的new int[5];区别只在于他们存在的位置。 5、释放数组
指针
时候:
delete
[] HeadPtr ; HeadPtr=nullptr; 6、智能
指针
,shared_ptr内部有引用计数 unique_ptr而没有。通过智能
指针
实现自动释放内存。 share_pt<
智能
指针
与
线程
安全
1、为什么需要智能
指针
,直接简单的
指针
有什么缺点? 当有
多个
指针
指向同一变量时。释放资源就会造成麻烦。 如果有一个
指针
已经
delete
了,其他
指针
再
delete
就会报错。 2、shared_ptr智能
指针
shared_ptr
指针
类有两个成员变量, 一个是指向变量的
指针
,一个是资源被引用的次数。 如果有n个智能
指针
同时指向一个资源,引用数就是n。
delete
释放
指针
会使引用减1,引用次数减为0时,才会释放堆区资源。 shared_ptr是
线程
安全的吗? shared_ptr的引用次数加减操作内部自动加锁解
C++多
线程
与共享
指针
文章目录C++多
线程
与共享
指针
一、C++多
线程
使用2.1 thread2.2 pthread C++多
线程
与共享
指针
一、C++多
线程
使用 2.1 thread <thread> 该头文件包含有std::thread类与std::this_thread类。以及管理
线程
的函数。是实现
线程
的主要文件。 <atomic> 该头文件包含有std::atomic和std::atomic_flag类,是实现原子操作的的主要文件。 <mutex> 包含互斥相关的类与函数。 <f
关于
指针
和野
指针
被
delete
delete
用于
指针
c++多
线程
、智能
指针
1、
线程
第一题:
线程
的基本概念、
线程
的基本状态及状态之间的关系?
线程
,有时称为轻量级进程,是CPU使用的基本单元;它由
线程
ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他
线程
共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。
线程
有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态。状态之间的转换如下图所示: 第二题:
线程
与进程的区别? 1、
线程
是进程的一部分,所以
线程
有的时候被称为是轻权进程或者轻量级进程。 2、 一个没有
线程
的进程是可以被看作单
线程
的,如果一个进程内拥有多
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章