我有一些代碼,將會從兩個線程訪問:多線程代碼 - 力執行順序
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;
指令。 (或者如果我忽略了別的東西)。
這不起作用,因爲start_不是一個小原子事物。 – teeks99 2009-01-20 21:55:21