Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实施Lamport';s Bakery算法的seg错误超过1个线程_C++_Multithreading_Segmentation Fault - Fatal编程技术网

C++ 实施Lamport';s Bakery算法的seg错误超过1个线程

C++ 实施Lamport';s Bakery算法的seg错误超过1个线程,c++,multithreading,segmentation-fault,C++,Multithreading,Segmentation Fault,我正在使用pthreads和一个处理器类作为共享内存来实现Lamport的烘焙算法。对于单线程,它可以正常工作,对于2个线程,在线程2运行了所有30次访问“bakery”的尝试后,我得到了seg错误: dl tls.c:没有这样的文件或目录 对于3个或更多线程,在从bakeryAlgo函数输出“here”两次后,我得到seg错误: 处理器中的0x0804ae52::处理器处的getNumber(此=0x5b18c483)。cpp:33 面包房 struct argStruct { vec

我正在使用pthreads和一个处理器类作为共享内存来实现Lamport的烘焙算法。对于单线程,它可以正常工作,对于2个线程,在线程2运行了所有30次访问“bakery”的尝试后,我得到了seg错误:

dl tls.c:没有这样的文件或目录

对于3个或更多线程,在从bakeryAlgo函数输出“here”两次后,我得到seg错误:

处理器中的0x0804ae52::处理器处的getNumber(此=0x5b18c483)。cpp:33

面包房

struct argStruct {
    vector<Processor>* processors;
    Processor* processor;
};

int findMax(vector<Processor>* processors) {
    int max = -99;
    for (int i = 0; i < processors->size(); i++) {
        if (processors->at(i).getNumber() > max) {
            max = processors->at(i).getNumber();
        }
    }
    return max;
}

void* bakeryAlgo(void* arg) {
    struct argStruct* args = static_cast<struct argStruct *>(arg);
    cout << "here" << endl;
    for (int i = 0; i < 30; i++) {
        args->processor->setChoosing(1);
        args->processor->setNumber(findMax(args->processors));
        args->processor->setChoosing(0);
        for (int j = 0; j < args->processors->size(); j++) {
            int jChoosing = args->processors->at(j).getChoosing();
            int jNumber = args->processors->at(j).getNumber();
            int jId = args->processors->at(j).getId();
            int pNumber = args->processor->getNumber();
            int pId = args->processor->getId();
            if (jId != pId) {
                while (jChoosing != 0) {}
                while (jNumber != 0 && ((jNumber < pNumber) || ((jNumber == pNumber) && (jId < pId)))) { }
            }
        }
        cout << "Processor: " << args->processor->getId() << " executing critical section!" << endl;
        args->processor->setNumber(0);
    }
}

int main(int argc, char *argv[]) {

    // Check that a command line argument was provided
    if (2 == argc) {
        int numProcessors = atoi(argv[1]);
        vector<Processor> processors;
        vector<argStruct> argVect;
        vector < pthread_t > threads;
        for (int i = 0; i < numProcessors; i++) {
            Processor p = Processor(i);
            processors.push_back(p);
        }
        for (int i = 0; i < numProcessors; i++) {
            pthread_t processorThread;
            struct argStruct args;
            args.processors = &processors;
            args.processor = &processors.at(i);
            argVect.push_back(args);
            threads.push_back(processorThread);
            pthread_create(&threads.at(i), NULL, &bakeryAlgo, &argVect.at(i));
        }
        for (int i = 0; i < numProcessors; i++) {
            pthread_join(threads.at(i), NULL);
        }
    } 
    else {
        cout << "Usage: bakery num, num is number of threads." << endl;
    }
    return 0;
}

有人知道为什么会发生这些seg故障吗?gdb说它们发生的地方在我看来像是无辜的代码行。

您是否使用指向
main
中定义的
向量的指针作为数据?堆栈不会在线程之间共享,因此访问此内存的其他线程最多只能是未定义的行为。我想这是您的问题的根源。

您正在获取向量中某个元素的地址,该向量正在发生变化:

    for (int i = 0; i < numProcessors; i++) {
        pthread_t processorThread;
        struct argStruct args;
        args.processors = &processors;
        args.processor = &processors.at(i);
        argVect.push_back(args);
        threads.push_back(processorThread);

        // danger! 
        pthread_create(&threads.at(i), NULL, &bakeryAlgo, &argVect.at(i));
    }

在创建线程之前,通过等待所有元素添加到向量,现在传递的指针在线程运行时保持良好状态。

是的,我认为这就是问题所在。我只是把线程/处理器类访问的所有东西都放在堆上,而不是main的堆栈上,现在它似乎可以工作了。我认为既然我可以将值从main传递到线程中,它就可以工作,但我猜不行。谢谢你的信息。
    for (int i = 0; i < numProcessors; i++) {
        pthread_t processorThread;
        struct argStruct args;
        args.processors = &processors;
        args.processor = &processors.at(i);
        argVect.push_back(args);
        threads.push_back(processorThread);

        // danger! 
        pthread_create(&threads.at(i), NULL, &bakeryAlgo, &argVect.at(i));
    }
    for (int i = 0; i < numProcessors; i++) {
        pthread_t processorThread;
        struct argStruct args;
        args.processors = &processors;
        args.processor = &processors.at(i);
        argVect.push_back(args);
        threads.push_back(processorThread);
    }
    for (int i = 0; i < numProcessors; i++) {
        pthread_create(&threads.at(i), NULL, &bakeryAlgo, &argVect.at(i));
    }