Я пытался найти подобную проблему, но не смог ее найти, или моих знаний недостаточно, чтобы распознать сходство.
У меня есть основной цикл создания объекта, тогда как этот объект имеетбесконечный цикл для обработки матрицы и работы с этой матрицей.Я вызываю эту функцию процесса в отдельном потоке и отсоединяю ее, чтобы она могла обрабатывать матрицу несколько раз, в то время как основной цикл может просто что-то ждать и ничего не делать.
Через некоторое время основной цикл получаетновая матрица, в то время как я представлял ее, просто создавая новую матрицу и передавая эту новую матрицу в объект.Идея состоит в том, что из-за ожидания нескольких секунд перед повторной обработкой в бесконечном цикле 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);
}
}
К сожалению, возникает состояние гонки.Обработка и обновление состоят из нескольких шагов в заблокированной среде мьютекса, в то время как я распечатываю данные на консоль между этими шагами.Я обнаружил, что и матрица испорчена, и буквы / цифры происходят параллельно, а не последовательно.
Есть идеи, почему это происходит?
С наилучшими пожеланиями и заранее благодарим