1

例如,我有两个类似这样的程序:
共享变量:

boolean f0 = false;
boolean f1 = false;

程序 0:

1. f0 = true;
2. while(f1==true){}
3. //Important section
4. f0 = false;

方案一:

a. f1 = true;
b. while(f0==true){}
c. //Important section
d. f1 = false;

我想问的是,有没有这样一种情况,两个进程可以同时进入Important section?你能给我一个具体代码执行的例子吗?
非常感谢。

4

5 回答 5

2

总之,是的,原因有很多(缓存、指令重新排序等)。

于 2012-11-26T22:39:21.290 回答
1

即使只有进程 0 写入 f0,进程 1 可能正在读取 f0,而进程 0 正在写入 f0,因此您绝对可以在临界区中获得两个进程。

您需要查找synronized关键字以了解如何安全地处理多线程。

于 2012-11-26T22:42:32.273 回答
0

如果此代码以顺序一致的方式执行,那么答案是否定的。没有这样的执行顺序允许这两个线程同时进入临界区。

如果我们考虑 Java 领域,那么是的,这是可能的。尽管它们共享一些数据,但您的线程不使用同步。在这种情况下,JVM 不能保证它们会观察到彼此的写入。

但无论如何,这种“互斥锁”很容易出现死锁。考虑这个执行:

f0 = true;
f1 = true;
---------------------
while (f0) {}
while (f1) {}
于 2012-11-30T19:59:04.240 回答
0

是的,这可能发生!

您可以保护该部分

// this Object must be shared between both Threads.
Object lock = new Object();

synronized(lock) {

//  .. here protected

}
于 2012-11-26T22:40:01.497 回答
0

如果这些确实是独立的进程,那么它们的操作是完全相互独立的,因此答案是“是”。每个都有自己的所有变量的副本。

你的意思是问线程吗?无论如何,除非您引入同步机制,否则答案是相同的。

于 2012-11-26T22:41:00.740 回答