C 应否";“初始计数”;变量“必须声明”;易变的;?
如果变量C 应否";“初始计数”;变量“必须声明”;易变的;?,c,multithreading,C,Multithreading,如果变量initCount被声明为volatile?否,它不需要是volatile。但是TaskLock()必须设置某种内存障碍,以确保操作按该顺序执行,即先锁定,然后加载initCount。很可能您的锁定原语已经完成了这项工作 .也许初始化的变量应该是?这会被优化吗?@JoshPetitt可能是从信号处理程序修改而来的:-?不过我不确定。如果只是从另一个线程修改,则不需要volatile,同时也不够。 static int initCount = 0; int objInit(void)
initCount
被声明为volatile
?否,它不需要是volatile
。但是TaskLock()
必须设置某种内存障碍,以确保操作按该顺序执行,即先锁定,然后加载initCount
。很可能您的锁定原语已经完成了这项工作
.也许初始化的变量应该是?这会被优化吗?@JoshPetitt可能是从信号处理程序修改而来的:-?不过我不确定。如果只是从另一个线程修改,则不需要volatile,同时也不够。
static int initCount = 0;
int objInit(void)
{
int i;
/* Check for reentrancy */
TaskLock ();
i = initCount++;
TaskUnlock ();
if (i > 0)
{
while (!initialized)
TaskDelay (100);
return (OK);
}
......
}