【发布时间】:2009-01-20 14:46:26
【问题描述】:
我有一些可以从两个线程访问的代码:
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() 被调用之前开始进入。
显然,在设置running_ 标志之前初始化start_ 变量非常重要。这可以通过添加一个互斥体来解决,该互斥体在输入 Start() 方法时被抓取......并且在在 Read() 方法中检查 running_ 之前被抓取......但这似乎有点不必要。如果这里的一切都按顺序执行,那么就没有问题。当另一个线程在 Start() 路由中时可能会发生 Read() ,例如从时钟中获取时间……Read() 发生得足够快以至于它只是不是大不了。
无论如何,我一直在寻找一种方法来确保编译器/处理器将执行
start_ = clock_->GetCurrentTime();
running_ = true;
指令按上面列出的顺序排列。 (或者如果我忽略了别的东西)。
【问题讨论】: