У меня есть код, который будет доступен из двух потоков:
class Timer{
public:
void Start(){
start_ = clock_->GetCurrentTime();
running_ = true;
}
void Read(){
if(running_){
time_duration remaining = clock_->GetCurrentTime() - start_;
Actions(remaining)
}
}
private:
void Actions(time_duration remaining);
time start_;
bool running;
};
Я посмотрел на некоторые другие таймеры, доступные в различных библиотеках, но не нашел ни одного, соответствующего моим требованиям, поэтому я сворачиваю свои собственные ...
Метод Start () вызывается (только один раз) из одного потока. Метод Read () вызывается очень быстро из другого потока, вызовы начнут поступать до вызова Start ().
Очевидно, что очень важно, чтобы переменная start_ была инициализирована до того, как установлен флаг running_. Эту проблему можно решить, добавив мьютекс, который захватывается при входе в метод Start () ... и захватывается перед проверкой running_ в методе Read () ... но это кажется несколько ненужным. Если все здесь выполняется по порядку, то проблем нет. У меня нет проблем с тем фактом, что Read () может произойти, когда другой поток находится в маршрутизации Start (), получая время от часов, например ... Read () происходит достаточно быстро, так что его большое дело
В любом случае, я искал способ гарантировать, что компилятор / процессор выполнит
start_ = clock_->GetCurrentTime();
running_ = true;
инструкции в порядке их перечисления выше. (Или если я пропускаю что-то еще).