多线程锁的问题

weirancg 2017-07-10 02:54:55
场景:线程1、线程2、布尔变量b。线程1和线程2都会读写布尔变量b,然后通过判断其真假,进行一些操作。

在线程1和线程2中,给b赋值,不是0,就是1:
b = 0;
……
b = 1;

对b进行判断也采用这种形式:
if(b == 0)
{
//dosomething
}
……
if(b == 1)
{
//dosomething
}
这样用是否可以不用加锁?
...全文
328 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
老马何以识途 2017-07-14
  • 打赏
  • 举报
回复
双线程的简单场景应该可以不加锁,看描述你也不需要两个线程互斥运行。
weirancg 2017-07-11
  • 打赏
  • 举报
回复
谢谢各位回复 @zhxianbin 实际编程时,我会用宏代替==,不会出现=和==混淆的问题。 对的,是有切换过程。 正常情况下,多线程是要用锁来保护全局变量的,但是我所描述的场景,只会对布尔变量b为-或者1进行处理,如果b为其他值,是会忽略的。我所疑惑的是:线程1正在改变b的值(给b赋0或1),线程2正好读写b(写的话,也是赋0或1),会不会使b有其他值出现,即不是0和1?如果没有其他值的出现,则整个逻辑应该没有影响,如果有,则这种情况程序不作处理,相当于丢失了某种状态。
zhxianbin 2017-07-11
  • 打赏
  • 举报
回复
c 里面的 bool 就是 int 吧 另外,楼主的代码是不是要 这样: if(0 == b) { //dosomething b = 1; } 有这样一个切换过程吧?
zhxianbin 2017-07-11
  • 打赏
  • 举报
回复
是不是要 if(0 == b) { //dosomething b = 1; } 这整个过程中 b 都不被改变
LubinLew 2017-07-10
  • 打赏
  • 举报
回复
引用 3 楼 zhxianbin 的回复:
volatile 也要加锁,volatile 避免 cache 和 内存不一致,但不能解决访问冲突吧
一个布尔变量的赋值过程是原子性的 所以可以不用加锁
zhxianbin 2017-07-10
  • 打赏
  • 举报
回复
volatile 也要加锁,volatile 避免 cache 和 内存不一致,但不能解决访问冲突吧
ipqtjmqj 2017-07-10
  • 打赏
  • 举报
回复
声明成volatile就不用加锁了
zhxianbin 2017-07-10
  • 打赏
  • 举报
回复
不行,还是要加锁的

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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