MRSW寄存器类的写方法有什么问题?

时间:2019-04-05 21:09:39

标签: java multithreading

在书“ The Art of Multiprocessor Programming”中,您可以在第84页上找到AtomicMRSWRegister Java类。 在本书的figure 4.13中,作者作了对角书写,如图4.12的32行所示:a_table[i][i] = value;

但是在本书的errata中,他们说应该改为a_table [ 0 ][ i ] = value;,在这种情况下,它不会对角书写。这与figure 4.13中的诊断文字相矛盾。

那是怎么回事?

public class AtomicMRSWRegister<T> implements Register<T> {
    ThreadLocal<Long> lastStamp;
    private StampedValue<T>[][] a_table; // each entry is SRSW atomic

    public AtomicMRSWRegister(T init, int readers) {
        lastStamp = new ThreadLocal<Long>() {
            protected Long initialValue() { return 0; };
        };

        a_table = (StampedValue<T>[][]) new StampedValue[readers][readers];
        StampedValue<T> value = new StampedValue<T>(init);

        for (int i = 0; i < readers; i++) {
            for (int j = 0; j < readers; j++) {
                a_table[i][j] = value;
            }
        }
    }

    public T read() {
        int me = ThreadID.get();
        StampedValue<T> value = a_table[me][me];

        for (int i = 0; i < a_table.length; i++) {
            value = StampedValue.max(value, a_table[i][me]);
        }

        for (int i = 0; i < a_table.length; i++) {
            a_table[me][i] = value;
        }

        return value;
    }

    public void write(T v) {
        long stamp = lastStamp.get() + 1;
        lastStamp.set(stamp);
        StampedValue<T> value = new StampedValue<T>(stamp, v);

        for (int i = 0; i < a_table.length; i++) {
            a_table[i][i] = value;
        }
    }
}

图4.12 AtomicMRSWRegister类:从以下位置构造的原子MRSW寄存器 原子SRSW寄存器。

0 个答案:

没有答案