有一个线程函数:
void FUN(...)
{
while(bFlag)
{
...
}
}还有一个终止线程的函数:
void StopThread()
{
bFlag = FALSE;
}我的问题:需要对bFlag变量进行加锁访问吗? 为什么?
void FUN(...)
{
while(bFlag)
{
...
}
}还有一个终止线程的函数:
void StopThread()
{
bFlag = FALSE;
}我的问题:需要对bFlag变量进行加锁访问吗? 为什么?
调试欢乐多
然后用interlock系列函数访问即可。
如果没有volatile,你这个循环被编译器优化后可能变成这样:
void FUN(...)
{
if(bFlag)
{
J_Loop1:
...
goto J_Loop1;
}
}
因为编译器并不知道你的bFlag会被另一个线程修改。
如果在多处理器系统里,因为缓存是独立的,不像多核单处理器那样共享,假如你的两个线程被系统调度到不同的cpu上,那你修改的bFlag还是不会反映到FUN所在的线程。因为同一段内存地址反映在不同的线程的视图都不一样了