我想要完成的伪代码:
//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
}
问题是,当我向所有dsps发送启动irq,包括id 0,我一遍又一遍地进入if statetment,我试图用全局静态bool标记它但是没有用。
答案 0 :(得分: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