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);
        }
    ......
}