1
lhx2008 2019-01-21 23:14:57 +08:00 via Android
为什么想不开要一直改成 0 呢,执行顺序确实是无法保证的,除非你 synchronize 一下了
|
2
niubee1 2019-01-21 23:25:21 +08:00 1
搞不清楚你的描述, 你到底是遇到了这样的问题, 还是想要实现这样的效果
很显然 a 是两个线程的临界区, 对临界区的访问不做同步不加锁, 那么临界区就不是线程安全的, 啥情况都有可能产生, 如果是线程安全的, 那么无论是同步还是加锁都是可控的. 我觉得楼主要加强一下语文才是王道 |
3
leoleoasd 2019-01-21 23:25:27 +08:00 1
锁
|
4
glacer 2019-01-22 00:11:11 +08:00
不对吧,就算没有第二个线程把 a = -1,a 在为 2 的时候变成 0,下一个循环的时候不还是执行代码 1 吗?
|
6
ryd994 2019-01-22 06:38:33 +08:00 1
要么加普通锁,要么用 RCU 或硬件原子操作。
@glacer 我感觉这段代码的目的是执行且只执行一次代码 1。只有 a==-1 时会执行一次。他描述的这种情况,就把一次执行漏掉了。 |
7
stebest 2019-01-22 09:37:20 +08:00
你这样开线程又没有先后顺序,要么 join,要么 wait,你要想先执行线程 1 一次,直接写在主线程就好。
|
8
jifengg 2019-01-22 09:55:16 +08:00
首先,你描述的问题确实挺奇怪。
其次,线程间要保持数据一致性,可以用锁,具体看各种语言的实现。 最后,祝你顺利解决问题。 |
9
PPing520 2019-01-22 10:04:27 +08:00
而接着在线程 1 的 if 块代码又把 a 改为 0。这样下一个循环的时候不就已经走到执行代码片段 1,哪来的走到执行 a = 0?楼主是不是表达错了意思?
|
10
PPing520 2019-01-22 10:07:25 +08:00
我也不管你到底意思是啥,,说白了这就是个普通的线程安全问题,你得分清哪些是临界区的代码,在进临界区和出临界区的时候加锁即可
|
11
fromxt 2019-01-22 10:56:31 +08:00 1
感觉线程 1 的目的就是 a=-1 执行以下代码 1,但是线程 2 可能在 if els 执行中改变 a 的值,那就把 if ... else ... 这段加一个互斥锁 mutex,保证执行完之后,再对 a 进行修改。
|
12
VictorJing94 2019-01-22 11:22:34 +08:00
...线程二存在的意义是什么..
|
13
richieboy 2019-01-22 11:22:46 +08:00 1
a 加上 volatile 修饰
|
14
Raymon111111 2019-01-22 11:28:37 +08:00 1
用锁
|
15
fano 2019-01-22 17:06:34 +08:00 1
老老实实用锁。
|
16
www5070504 2019-01-22 17:23:44 +08:00 1
用锁用事件都行
|