关于多线程访问安全性问题

一个程序员的修炼之路 2012-04-16 09:47:09
有一个线程函数:
void FUN(...)
{
while(bFlag)
{
...
}
}

还有一个终止线程的函数:
void StopThread()
{
bFlag = FALSE;
}

我的问题:需要对bFlag变量进行加锁访问吗? 为什么?
...全文
181 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyh12345 2012-04-16
  • 打赏
  • 举报
回复
不需要
tao_fuqiang 2012-04-16
  • 打赏
  • 举报
回复
不用加锁
小马喝水 2012-04-16
  • 打赏
  • 举报
回复
这个要看需求,如果是对这个控制的精度要求很精确的场合就要加锁,一般情况下就不用了
BombZhang 2012-04-16
  • 打赏
  • 举报
回复
不需要
  • 打赏
  • 举报
回复
补充下:bFlag就只有在此两处访问
ok1234567 2012-04-16
  • 打赏
  • 举报
回复
只要是多线程共享的资源,就总是进行同步处理,是不是更简单呢?
不能保证依赖的前提总是成立,就像写表达式,多写几个括号,心里踏实(与其念叨优先级)
unituniverse2 2012-04-16
  • 打赏
  • 举报
回复
算了。。。说简单些吧:只要在两个线程都要读、且有至少一个线程写的场合,都要加锁或使用同步机制的
unituniverse2 2012-04-16
  • 打赏
  • 举报
回复
最好用原子操作。因为存在编译优化和多cache同步的问题。另外volatile 是一定要的。

编译优化:
如果没有volatile,你这个循环被编译器优化后可能变成这样:
void FUN(...)
{
if(bFlag)
{
J_Loop1:
...
goto J_Loop1;
}
}
因为编译器并不知道你的bFlag会被另一个线程修改。
如果在多处理器系统里,因为缓存是独立的,不像多核单处理器那样共享,假如你的两个线程被系统调度到不同的cpu上,那你修改的bFlag还是不会反映到FUN所在的线程。因为同一段内存地址反映在不同的线程的视图都不一样了
draracle 2012-04-16
  • 打赏
  • 举报
回复
没必要,如果你觉得不放心,可以考虑用volatile int申明,
然后用interlock系列函数访问即可。
向立天 2012-04-16
  • 打赏
  • 举报
回复
不用
访问控制是怕同时写发生错乱
你这个线程中只是读
所以没必要做控制

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧