关于多线程的,内存分配与释放的问题????

时间:2022-05-16 02:26:02
我,在一个线程中,分配内存,插入用双向循环链表来实现的队列,在另一个线程中用,出队,释放内存。用new 分配的用 Delete来释放。??????为啥不行???如何解决。难道,不能,跨线程分配,释放内存??

20 个解决方案

#1


study

#2


share first queue point 

#3


能给我一份程序吗,可以帮你看看。

#4


yonggl@sina.com

#5


我帮你调试好吗,hujun@serve100ok.com

#6


new/delete肯定可以,只要在一个进程内。但入队/出对必须互斥,否则将引起不可预见的问题
做法,申明一个原子操作对象如CMutex mutex,在每个线程要调用队列的成员时首先mutex.lock(),然后再Unlock(),就不会有问题了

#7


ujun614(胡均):我看不一定,你会调试。我用DirextX的DirectShow来播放媒体流,用DirectPlay来网络传输

#8


ourworld() :我用的临界区实现的互斥.在一个进程内好象用临界区就可以了用CMutex mutex好象更占用资源.我更关心的是,内存释放的问题,内存共享好象没有问题.

#9


没有人回答??

#10


跨进程进行内存操作可能是有问题,我连分配都有过报错,但编译却是能通过的。

估计有更好的方法能实现。

#11


hxd1114(*者) :我的仅仅是跨线程分配,还没有到达跨进程分配的程度。能用另外的分配方法吗?比如,那个COM接口

#12


临界够了,没错delete在同进程内没问题,如果delete非法说明指针有错或不使用new分配,或许你可以说的更详细一点

#13


修改队列指针时注意线程同步

#14


Kevin_qing(Kevin):我这个没有线程同步的问题(不必要)。只需要,互斥使用队列。

#15


你不能这样做,应该是通过共享内存的机制来进行,对于这块内存,使用临界区来进行
控制。

#16


怨代码呢??

贴除来啊!

#17


入队: PATCKET_MPEG1_DATA_NODE *pDataMsgNode;
pDataMsgNode = new PATCKET_MPEG1_DATA_NODE;

EnterCriticalSection( &g_csDataList );

//入队
pDataMsgNode->pPrev = g_DataHead.pPrev;
pDataMsgNode->pNext = &g_DataHead;
g_DataHead.pPrev->pNext = pDataMsgNode;
g_DataHead.pPrev = pDataMsgNode;

//填充数据
pDataMsgNode->mpeg1Data.dwPacketId = pMsg->dwPacketId;
pDataMsgNode->mpeg1Data.dwType = pMsg->dwType;
pDataMsgNode->mpeg1Data.mt.majortype = pMsg->mt.majortype ;
pDataMsgNode->mpeg1Data.mt.subtype = pMsg->mt.subtype;
CopyMemory(pDataMsgNode->mpeg1Data.pBuffer, pMsg->pBuffer, 32768);
strcpy(pDataMsgNode->mpeg1Data.szMediaFileName, pMsg->szMediaFileName);
LeaveCriticalSection( &g_csDataList );


出队:

PATCKET_MPEG1_DATA_NODE*  pSendNode; 
    PATCKET_MPEG1_DATA_NODE*  pNode = g_DataHead.pNext;
    while( true)
{
EnterCriticalSection( &g_csDataList );
if (pNode != &g_DataHead )
{
pSendNode = pNode;

//从双循环链表中删去节点
pSendNode->pNext->pPrev = &g_DataHead;
g_DataHead.pNext = pSendNode->pNext;

//得到值
PBYTE  pBuffer = new BYTE[32768]; 
CopyMemory(pBuffer,pSendNode->mpeg1Data.pBuffer, 32768);
//delete  pSendNode;
//pSendNode=0;

//转发数据到流的缓冲
while ((g_pMediaDataStream->AddBuf(pBuffer) ==-1))
{
SetEvent( g_hDPBroadCastAvailEvent);
Sleep(10);
};
//delete[] pBuffer;
//pBuffer = 0;

//得到下一个待处理节点
pNode = g_DataHead.pNext;
}
else
{
pNode = g_DataHead.pNext;
Sleep(10);
}
LeaveCriticalSection( &g_csDataList );
}

#18


http://www.csdn.net/expert/topic/464/464120.shtm

帮帮我吧(网吧管理软件)

#19


zzh():我这个也是共享内存--临界区管理。不过用双向循环链表实现动态队列。因为得到数据---从网络,我不能保证同步。用数据载媒体流的中,我也不能保证。所以,用链表实现队列。有柔性,对于环境苛刻的场合使用。

#20


没有人??来喝彩!!!!这个问题,解决了。能够分配,不过频繁的分配释放,要死掉。我的仔细处理。

#1


study

#2


share first queue point 

#3


能给我一份程序吗,可以帮你看看。

#4


yonggl@sina.com

#5


我帮你调试好吗,hujun@serve100ok.com

#6


new/delete肯定可以,只要在一个进程内。但入队/出对必须互斥,否则将引起不可预见的问题
做法,申明一个原子操作对象如CMutex mutex,在每个线程要调用队列的成员时首先mutex.lock(),然后再Unlock(),就不会有问题了

#7


ujun614(胡均):我看不一定,你会调试。我用DirextX的DirectShow来播放媒体流,用DirectPlay来网络传输

#8


ourworld() :我用的临界区实现的互斥.在一个进程内好象用临界区就可以了用CMutex mutex好象更占用资源.我更关心的是,内存释放的问题,内存共享好象没有问题.

#9


没有人回答??

#10


跨进程进行内存操作可能是有问题,我连分配都有过报错,但编译却是能通过的。

估计有更好的方法能实现。

#11


hxd1114(*者) :我的仅仅是跨线程分配,还没有到达跨进程分配的程度。能用另外的分配方法吗?比如,那个COM接口

#12


临界够了,没错delete在同进程内没问题,如果delete非法说明指针有错或不使用new分配,或许你可以说的更详细一点

#13


修改队列指针时注意线程同步

#14


Kevin_qing(Kevin):我这个没有线程同步的问题(不必要)。只需要,互斥使用队列。

#15


你不能这样做,应该是通过共享内存的机制来进行,对于这块内存,使用临界区来进行
控制。

#16


怨代码呢??

贴除来啊!

#17


入队: PATCKET_MPEG1_DATA_NODE *pDataMsgNode;
pDataMsgNode = new PATCKET_MPEG1_DATA_NODE;

EnterCriticalSection( &g_csDataList );

//入队
pDataMsgNode->pPrev = g_DataHead.pPrev;
pDataMsgNode->pNext = &g_DataHead;
g_DataHead.pPrev->pNext = pDataMsgNode;
g_DataHead.pPrev = pDataMsgNode;

//填充数据
pDataMsgNode->mpeg1Data.dwPacketId = pMsg->dwPacketId;
pDataMsgNode->mpeg1Data.dwType = pMsg->dwType;
pDataMsgNode->mpeg1Data.mt.majortype = pMsg->mt.majortype ;
pDataMsgNode->mpeg1Data.mt.subtype = pMsg->mt.subtype;
CopyMemory(pDataMsgNode->mpeg1Data.pBuffer, pMsg->pBuffer, 32768);
strcpy(pDataMsgNode->mpeg1Data.szMediaFileName, pMsg->szMediaFileName);
LeaveCriticalSection( &g_csDataList );


出队:

PATCKET_MPEG1_DATA_NODE*  pSendNode; 
    PATCKET_MPEG1_DATA_NODE*  pNode = g_DataHead.pNext;
    while( true)
{
EnterCriticalSection( &g_csDataList );
if (pNode != &g_DataHead )
{
pSendNode = pNode;

//从双循环链表中删去节点
pSendNode->pNext->pPrev = &g_DataHead;
g_DataHead.pNext = pSendNode->pNext;

//得到值
PBYTE  pBuffer = new BYTE[32768]; 
CopyMemory(pBuffer,pSendNode->mpeg1Data.pBuffer, 32768);
//delete  pSendNode;
//pSendNode=0;

//转发数据到流的缓冲
while ((g_pMediaDataStream->AddBuf(pBuffer) ==-1))
{
SetEvent( g_hDPBroadCastAvailEvent);
Sleep(10);
};
//delete[] pBuffer;
//pBuffer = 0;

//得到下一个待处理节点
pNode = g_DataHead.pNext;
}
else
{
pNode = g_DataHead.pNext;
Sleep(10);
}
LeaveCriticalSection( &g_csDataList );
}

#18


http://www.csdn.net/expert/topic/464/464120.shtm

帮帮我吧(网吧管理软件)

#19


zzh():我这个也是共享内存--临界区管理。不过用双向循环链表实现动态队列。因为得到数据---从网络,我不能保证同步。用数据载媒体流的中,我也不能保证。所以,用链表实现队列。有柔性,对于环境苛刻的场合使用。

#20


没有人??来喝彩!!!!这个问题,解决了。能够分配,不过频繁的分配释放,要死掉。我的仔细处理。

#21