2013-03-10 2 views
-4

У меня есть два класса C++, objecManip и updater. Класс updater имеет таймер, чтобы проверить состояние руки робота моего приложения.Программирование в реальном времени на C++

Если это движение, то ничего не делать, иначе getNextAction() из очереди действий.

Очередь действий заполнена классом objectManip. У меня есть глобальная переменная: current_status от руки робота, которая мне нужна в objectManip.

Проблема в том, что при заполнении операций очередь current_status берется постоянно не динамически.

+0

Почему сообщение с кодом выглядит плохой идеей? – Shoe

+0

В чем вопрос? – 2013-03-10 07:48:29

+0

Значение current_status принимается за его содержимое при заполнении очереди действий, и мне нужно динамическое, чтобы оно принимало новое значение при вызове действия в updater. –

ответ

1

Вопрос очень неясен, так что это действительно удар в темноте, но вам нужно использовать атомные типы данных. С C++ 11, у вас есть std::atomic (см here или here. Для более ранних версий C++, я думаю, вам нужно использовать некоторые библиотеки или компиляторе определенного типа данных, который предлагает атомарные типы данных.

Если вы сделаете некоторые предположения о том, как многопоточность работает для вашего процессора и операционной системы, вы можете отказаться от простого объявления общих переменных volatile и считывания значения переменной temp при ее использовании. volatile действительно предназначен для случаев, таких как чтение отображаемых аппаратных значений, где значение должны считываться из памяти каждый раз, поэтому многие оптимизации не возможны. Это не гарантирует самонастройки атома, поскольку поток, изменяющий значение, может быть прерван в середине обновления, а затем ano прочитанное может читать недопустимое, частично обновленное значение. Для boolean это должно быть достаточно безопасным. Для целых чисел, которые не пересекают границу слова памяти и размер слова или меньше, это может быть безопасным для многих процессоров, которые не будут прерывать поток в середине написания одного слова памяти. В противном случае ожидается повреждение данных. Некоторые (сегодня необычные) процессоры также не синхронизируют кеши между несколькими ядрами ЦП, и в этом случае volatile не поможет, разные потоки могут видеть различное кешированное значение. Итак, сделайте вывод: используйте volatile в качестве последнего взлома!

+1

Я работаю с одним ядром, я могу попробовать вам решение, thx –

Смежные вопросы