我理解用于互斥的算法,例如Dekker的算法和Peterson的算法,需要一个潜在的顺序一致的内存模型才能工作(或者使用内存屏障),但我不清楚它们是否需要原子负载和存储。在 for Peterson的算法中,它说:
该算法满足了求解临界截面问题的三个基本准则,只要变量的变化立即和原子地传播到变量转、标志和标志。
我不清楚上面引用的位,以及这是否意味着该算法需要原子负载和存储才能工作。看看Peterson的算法,我不明白为什么需要原子负载和存储才能工作。我在中没有提到这种原子性要求。那么,Peterson的算法是否需要原子负载和存储,并将其扩展到所有互斥算法?
我正在尝试用Java语言实现,目前已经创建了以下内容
public class Peterson {
private volatile boolean[] flag = new boolean[2];
private volatile int victim;
public void lock(int id)
{
//System.out.println(id);
int i = id;
int j = 1 - id;
flag[i] = true;
victim = i;
我在C++中用多线程编写了Peterson算法的一个简单实现。此程序通过两个线程更改字符串。但我没有得到最终结果。我哪里错了?
using namespace std;
int flag[2]={0,1};
int turn;
void* first(void* data){
flag[0]=1;
turn=1;
while(flag[1] && turn==1){}
string &str=*(static_cast<string*>(data));
if(str!=""){
if
据我所知,内存屏障将“分离”加载/存储(取决于所使用的屏障类型),而不管与“隔离”指令相关联的存储器地址。因此,如果我们有一个原子增量,周围有加载和存储:
LOAD A
STORE B
LOAD C
LOCK ADD D ; Assume full fence here
LOAD E
STORE F
在A、B和C上操作的指令必须在D之前完成;而E和F可能要在D之后才开始。
但是,由于锁只应用于地址D,为什么要限制其他指令呢?它是不是太复杂了,无法在电路中实现?还是有其他原因呢?
在下面的代码中,线程2中的x值将始终为10,因为存在原子线程围栏。
int x;
atomic<bool> b(false);
// thread 1:
x = 10;
atomic_thread_fence(memory_order_release);
b = true;
// thread 2:
while(!b){}
atomic_thread_fence(memory_order_acquire);
assert(x == 10); // x will always be 10
但是在下面的代码中,线程2中的*x总是10吗?
int* x = new int;
atom
我已经读过几次和相关的MSDN页面,所以。尽管如此,我仍不完全理解Volatile.Read/Write和互锁操作是否只适用于相关变量,或操作前后的所有读/写操作。
例如,想象一下我有一个数组和一个计数器。
long counter = 0;
var values = new double[1000000];
values[42] = 3.1415;
// Is this line needed instead of simple assignment above,
// or the implicit full-fence of Interlocked will guarantee tha
Is there any difference between kernel space & user space MEMORY ALLOCATIONS?
From which region of memory they get allocated.
有人能在这方面提供一些建议吗?
谢谢。
诚挚的问候,
桑迪普·辛格