Woo*_*kai 2 c++ heap multithreading pointers memory-management
我有一个使用自定义线程池类运行的多线程应用程序.线程都执行相同的功能,具有不同的参数.
这些参数通过以下方式提供给threadpool类:
// jobParams is a struct of int, double, etc...
jobParams* params = new jobParams;
params.value1 = 2;
params.value2 = 3;
int jobId = 0;
threadPool.addJob(jobId, params);
Run Code Online (Sandbox Code Playgroud)
一旦线程无关,它就会获得下一个参数并运行作业功能.我决定删除threadpool类中的参数:
ThreadPool::~ThreadPool() {
for (int i = 0; i < this->jobs.size(); ++i) {
delete this->jobs[i].params;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这样做时,我有时会遇到堆损坏错误:
为RtlFreeHeap指定的地址无效
奇怪的是,在一个案例中它完美地运行,但在另一个程序中它崩溃了这个错误.我尝试在其他地方删除指针:在执行作业功能后的线程中(我得到相同的堆损坏错误)或在作业函数本身结束时(在这种情况下没有错误).
我不明白如何从不同的地方删除相同的指针(我检查,地址是相同的)更改任何东西.这与多线程这一事实有什么关系吗?
我有一个关键部分来处理对参数的访问.我不认为问题是关于同步访问.无论如何,只有在完成所有线程后才会调用析构函数,并且我不会在其他地方删除任何指针.指针可以自动删除吗?
至于我的代码.作业列表是结构的队列,由作业的id(以后能够获得特定作业的输出)和参数组成.
getNextJob() 每次完成执行上一个作业时,线程调用它们(它们都有一个指向ThreadPool的指针).
void ThreadPool::addJob(int jobId, void* params) {
jobData job; // jobData is a simple struct { int, void* }
job.ID = jobId;
job.params = params;
// insert parameters in the list
this->jobs.push(job);
}
jobData* ThreadPool::getNextJob() {
// get the data of the next job
jobData* job = NULL;
// we don't want to start a same job twice,
// so we make sure that we are only one at a time in this part
WaitForSingleObject(this->mutex, INFINITE);
if (!this->jobs.empty())
{
job = &(this->jobs.front());
this->jobs.pop();
}
// we're done with the exclusive part !
ReleaseMutex(this->mutex);
return job;
}
Run Code Online (Sandbox Code Playgroud)
让我们把它转过头来:你为什么要使用指针?
class Params
{
int value1, value2; // etc...
}
class ThreadJob
{
int jobID; // or whatever...
Params params;
}
class ThreadPool
{
std::list<ThreadJob> jobs;
void addJob(int job, const Params & p)
{
ThreadJob j(job, p);
jobs.push_back(j);
}
}
Run Code Online (Sandbox Code Playgroud)
没有新的,删除或指针......显然,一些实现细节可能会翘起,但你可以得到整体情况.
| 归档时间: |
|
| 查看次数: |
2954 次 |
| 最近记录: |