2017-05-03 150 views
0

什麼我要完成的僞代碼:使代碼運行一次

//gets current running digital singal processor 
int dsp_id = get_dsp_id(); 
if (dsp_id == 0) { 
//code run only once 
//irq start all other dsps including dsp_id 0 
} else { 
    //code run multiple times 
} 

問題是,當我送IRQ開始給所有的DSP包括ID 0我在拿到如果statetment一遍又一遍,我試圖用全局靜態布爾來標記它,但那不起作用。

+3

目前還不清楚這一點。您能否詳細說明一下,添加[MCVE](http://stackoverflow.com/help/mcve)? – LPs

+0

我無法添加MCVE,因爲它已被分類。 –

回答

1

你有一個競賽條件。我設想在設置全局變量之前,您啓動的其他線程擊中if聲明。你需要用一個互斥鎖來保護鎖。在僞代碼中,這可能類似於

if (dsp_id == 0) { 
    get mutex lock 
    if (!alreadyRun) 
    { 
     //code run only once 
     //irq start all other dsps including dsp_id 0 
     set alreadyRun to true 
    } 
    release mutex lock 
} else { 
    //code run multiple times 
} 

其中alreadyRun是您的布爾變量。順便說一下,你不能寫alreadyRun = true,因爲如果處理器的緩存設置沒有被刷新回主內存,那麼其他處理器就不能保證會看到改變。您的線程庫將具有適當的功能來執行互斥鎖並安全地設置alreadyRun。例如,C11在stdatomic.h中定義了原子類型和操作,用於標記和互斥函數threads.h

+0

我的第一種方法是將標誌寫入外部存儲器,但是我發現它很慢並且很難看,這種方法更快,更合適。謝謝! –