Состояние гонки в отдельной теме - PullRequest
0 голосов
/ 01 марта 2019

Я пытался найти подобную проблему, но не смог ее найти, или моих знаний недостаточно, чтобы распознать сходство.

У меня есть основной цикл создания объекта, тогда как этот объект имеетбесконечный цикл для обработки матрицы и работы с этой матрицей.Я вызываю эту функцию процесса в отдельном потоке и отсоединяю ее, чтобы она могла обрабатывать матрицу несколько раз, в то время как основной цикл может просто что-то ждать и ничего не делать.

Через некоторое время основной цикл получаетновая матрица, в то время как я представлял ее, просто создавая новую матрицу и передавая эту новую матрицу в объект.Идея состоит в том, что из-за ожидания нескольких секунд перед повторной обработкой в ​​бесконечном цикле while функция обновления может блокировать мьютекс, а мьютекс (почти) часто не блокируется.

Ниже я попытался кодироватьминимальный пример.

class Test
    {
    public:
        Test();
        ~Test();

    void process(){
        while(1){
             boost::mutes::scoped_lock locker(mtx);
             std::cout << "A" << std::endl;
             // do stuff with Matrix
             std::cout << "B" << std::endl;
             mtx.unlock();
             //wait for few microseconds
        }
    }

    void updateMatrix(matrix MatrixNew){
        boost::mutes::scoped_lock locker(mtx);
        std::cout << "1" << std::endl;
        Matrix = MatrixNew;
        std::cout << "2" << std::endl;
    }

private:
    boost::mutex mtx;
    matrix Matrix;
}

int main(){
Test test;
boost::thread thread_;

thread_ = boost::thread(&Test::process,boost::ref(test));
thread_.detach();

while(once_in_a_while){
    Matrix MatrixNew;
    test.updateMatrix(MatrixNew);
}
}

К сожалению, возникает состояние гонки.Обработка и обновление состоят из нескольких шагов в заблокированной среде мьютекса, в то время как я распечатываю данные на консоль между этими шагами.Я обнаружил, что и матрица испорчена, и буквы / цифры происходят параллельно, а не последовательно.

Есть идеи, почему это происходит?

С наилучшими пожеланиями и заранее благодарим

1 Ответ

0 голосов
/ 01 марта 2019
    while(1){
         boost::mutes::scoped_lock locker(mtx);
         std::cout << "A" << std::endl;
         // do stuff with Matrix
         std::cout << "B" << std::endl;
         mtx.unlock();
         //wait for few microseconds
    }

Здесь вы вручную разблокируете mtx.Затем, через некоторое время scoped_lock (называемый locker) также разблокирует мьютекс в его деструкторе (который является точкой этого класса).Я не знаю, что требуется для гарантии boost::mutex, но разблокирование ее чаще, чем вы заблокировали, не может привести к чему-то хорошему.

Вместо mtx.unlock(); вы, вероятно, хотите locker.unlock();

Редактировать: здесь рекомендуется не использовать boost для этого и использовать вместо этого стандартный c ++.thread ing был частью стандарта с C ++ 11 (8 лет!), Поэтому, вероятно, все ваши инструменты теперь будут его поддерживать.Использование стандартизированного кода / инструментов дает вам лучшую документацию и лучшую помощь, поскольку они намного более известны.Я не сбиваю надстройку (большая часть стандарта запущена в надстройке), но как только что-то добавлено в стандарт, вам следует серьезно подумать об его использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...