C++线程传递的参数当线程启动后该参数能释放吗
如题,在写多线程的时候,比如我有几十万甚至几百万的任务,我想每个任务都单独地用一个线程去处理,所以有一个for循环:for(inti=0;i<任务数量;i++)在for循...
如题,在写多线程的时候,比如我有几十万甚至几百万的任务,我想每个任务都单独地用一个线程去处理,所以有一个for循环:for(int i=0;i<任务数量;i++)在for循环里面启动线程,当然线程数量是我自己控制的,所以在for循环里每当要启动线程时都用WaitForSingleObject控制线程数量。
现在的问题是,每开一个线程我都要传递一些参数进去,所有参数封装在一个结构体里面,若每次都传递,那么我想在这个for循环未结束的话那么这些结构体变量岂不一直占用内存(几百万个任务就会有几百万个这样的结构体)?所以我想在线程启动的时候能不能只是传值进去,传完后就把该结构体释放掉,这样就节省了内存。
伪代码:
struct Params
{
int a,b,c;
CString d,e,f;
};
for(int i=0; i<1000000; i++)
{
Params p;
p.a = 0;
...//初始化参数变量
WaitForSingleObject(csemaphore->m_hObject, INFINITE);
AfxBeginThread(
ThreadProc,
&p,
THREAD_PRIORITY_NORMAL,
1024 * 8,
STACK_SIZE_PARAM_IS_A_RESERVATION,
NULL);
}
UINT __cdecl ThreadProc(LPVOID pParam)
{
...
ReleaseSemaphore(csemaphore->m_hObject, 1, NULL);
} 展开
现在的问题是,每开一个线程我都要传递一些参数进去,所有参数封装在一个结构体里面,若每次都传递,那么我想在这个for循环未结束的话那么这些结构体变量岂不一直占用内存(几百万个任务就会有几百万个这样的结构体)?所以我想在线程启动的时候能不能只是传值进去,传完后就把该结构体释放掉,这样就节省了内存。
伪代码:
struct Params
{
int a,b,c;
CString d,e,f;
};
for(int i=0; i<1000000; i++)
{
Params p;
p.a = 0;
...//初始化参数变量
WaitForSingleObject(csemaphore->m_hObject, INFINITE);
AfxBeginThread(
ThreadProc,
&p,
THREAD_PRIORITY_NORMAL,
1024 * 8,
STACK_SIZE_PARAM_IS_A_RESERVATION,
NULL);
}
UINT __cdecl ThreadProc(LPVOID pParam)
{
...
ReleaseSemaphore(csemaphore->m_hObject, 1, NULL);
} 展开
展开全部
百万个线程?!不崩了才怪。(你到你电脑的任务管理器里去看看整个系统才多少个线程。)
光是你给每个线程分配8k的堆栈,100万个就是多少?(8G)
至于传入的参数,我记得是不能释放的,除非线程不用这些参数。你自己可以做个试验,在线程里改传入的参数值,在主线程里再检查这参数是否被改了,如果是则不能释放,不是则可以释放。
光是你给每个线程分配8k的堆栈,100万个就是多少?(8G)
至于传入的参数,我记得是不能释放的,除非线程不用这些参数。你自己可以做个试验,在线程里改传入的参数值,在主线程里再检查这参数是否被改了,如果是则不能释放,不是则可以释放。
追问
我说了线程数量我自己控制的,WaitForSingleObject控制,所以不会超过我固定的线程数,当目前的线程完成了它的任务它就会退出,然后我就又继续增加一个线程,如此一来就相当于开了百万个线程,只不过这些线程不是同时运行的,有个最大线程数限制。 我现在的问题是 如果这些参数不能被释放,那我循环百万次岂不要等到循环结束才能释放这些参数?这样的话好像很浪费内存。
追答
在线程结束后释放传入的参数
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询