【问题标题】:C++ pointer errors using pthreads使用 pthread 的 C++ 指针错误
【发布时间】:2014-11-04 02:26:51
【问题描述】:

我是 C++ 语言的新手,在使用 pthread 的程序中访问指针/内存时遇到了一些问题。 这是交易:我有一个名为 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)”和“分段错误”错误,但无法找出原因。我没有使用 malloc 或 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);

    ...
}

不知何故,我遇到了我在运行时提到的双重释放或损坏和分段错误。有人能看出什么不对吗? 很抱歉这个大问题,提前感谢!

【问题讨论】:

  • 这是调试器的工作,不是我们的......
  • @πάνταῥεῖ 我尝试过调试,但是当你有线程时很难做到(或者我还不知道如何正确地做到这一点)

标签: c++ pointers segmentation-fault pthreads


【解决方案1】:

在快速查看您的代码后,以下是提示:

                    processedFiles.push_back(files[j]);

                    files.erase(files.begin() + j);

正在修改可以由多个线程同时使用的集合。您应该添加锁以防止两个线程这样做。

【讨论】:

  • 谢谢,我去看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多