使用pthreads的C++指针错误

C++ pointer errors using pthreads

本文关键字:指针 错误 C++ pthreads 使用      更新时间:2023-10-16

我是C++语言的新手,在使用pthreads的程序中,我在指针/内存访问方面遇到了一些问题。交易如下:我有一个名为Media的类,如下所示:

class Media
{
    public:
        int id;
        int freeSpace = CAPACITY;
        pthread_mutex_t mutex;
};

和一个名为File的类,如下所示:

class File
{
    public:
        int id;
        string name;
        int size;
        pthread_mutex_t mutex;
        Media *media;
    ...
};

这对问题来说并不重要,但我的程序做了以下几点:我有一个向量,里面有一些随机大小的随机文件,我想用线程把它们放在最小数量的媒体中。问题是,我经常出现"双重自由或腐败(fasttop)"、"双重自由和腐败(!prev)"answers"分段错误"错误,但我找不出原因。我既没有使用mallocs,也没有使用frees,但我可能以错误的方式或类似的方式使用指针。以下是我的主类的一部分,其中包含线程中使用的方法:

vector<Media> medias;
vector<File> files;
vector<File> processedFiles;
void* processFiles(void* args)
{
    for (int i = 0; i < mediaQuantity; i++)
    {
        if (pthread_mutex_trylock(&medias[i].mutex) == 0)
        {
            Media* media = &medias[i];
            for (int j = (int)files.size() - 1; j >= 0; j--)
            {
                if (pthread_mutex_trylock(&files[j].mutex) == 0)
                {
                    if (files[j].size <= media->freeSpace)
                    {
                        media->freeSpace -= files[j].size;
                        files[j].media = media;
                        processedFiles.push_back(files[j]);
                        files.erase(files.begin() + j);
                    }
                    pthread_mutex_unlock(&files[j].mutex);
                }
            }
            pthread_mutex_unlock(&medias[i].mutex);
        }
    }
}

int main()
{
    ...
    Media* media;
    ...
    pthread_t threads[threadQuantity];
    pthread_barrier_init(&barrier, NULL, threadQuantity);
    ...
    for (int i = 1; i <= mediaQuantity; i++)
    {
        media = new Media();
        media->id = i;
        medias.push_back(*media);
    }
    //Create threads
    for(unsigned i = 0; i < threadQuantity; i++)
        pthread_create(&threads[i], NULL, processFiles, NULL);
    for(unsigned i = 0; i < threadQuantity; i++)
        pthread_join(threads[i], NULL);
    ...
}

不知怎的,我得到了我在运行时提到的双重免费或损坏和分割错误。有人看到什么不对吗?抱歉问了这么大的问题,提前谢谢!

快速查看代码后,以下是一个提示:

                    processedFiles.push_back(files[j]);
                    files.erase(files.begin() + j);

正在修改可由多个线程模拟使用的集合。您应该添加锁以防止两个线程执行此操作。