Kotlin单身人士(更具体地说,对象声明)是否通过构造进行线程安全?如果没有,在Kotlin中编写线程安全单例的最佳做法是什么?
我猜它们是,但我无法在文档中找到任何关于它的明确声明.
我有以下C++ 2011代码:
std::atomic<bool> x, y;
std::atomic<int> z;
void f() {
x.store(true, std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_release);
y.store(true, std::memory_order_relaxed);
}
void g() {
while (!y.load(std::memory_order_relaxed)) {}
std::atomic_thread_fence(std::memory_order_acquire);
if (x.load(std::memory_order_relaxed)) ++z;
}
int main() {
x = false;
y = false;
z = 0;
std::thread t1(f);
std::thread t2(g);
t1.join();
t2.join();
assert(z.load() !=0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的计算机体系结构类中,我们被告知此代码中的断言始终成立.但经过现在的审查,我无法理解为什么会这样.
据我所知:
如果我的理解是正确的,为什么不能发生以下一系列行动?
y.store(true, std::memory_order_relaxed);被称为我认为这符合'获取' - '发布'规则,但是,例如在这个问题的最佳答案:理解c ++ 11内存栅栏,这与我的情况非常相似,它暗示我的步骤1动作序列不能在'memory_order_release'之前发生,但是由于其背后的原因没有详细说明.
我对此感到非常困惑,如果有人能说清楚它会很高兴:)
我从锚点 0.17 更新到版本 0.24,从那时起,获取收款帐户失败并出现锚点错误,如下所示:
Error: Invalid account discriminator
这是我的代码
export const getCollectionPDA = async (candyMachineAddress: string): Promise<anchor.web3.PublicKey> => {
return (
await anchor.web3.PublicKey.findProgramAddress(
[Buffer.from("collection"), new PublicKey(candyMachineAddress).toBuffer()],
new PublicKey(CANDY_MACHINE_PROGRAM_V2)
)
)[0];
};
const provider = new AnchorProvider(connection, getmywallet(), {
preflightCommitment: "finalized",
commitment: "finalized",
});
const idl = await Program.fetchIdl(CANDY_MACHINE_PROGRAM_V2, provider);
const anchorProgram = new Program(idl, CANDY_MACHINE_PROGRAM_V2, provider);
const candyMachineId = "63gzhYWxJ4Yfc5QahLxV6NChSjJZNWW93Sy9CHz8YkCe";
const collectionPDA = await getCollectionPDA(candyMachineId);
const collectionPDAAccount = await connection.getAccountInfo(collectionPDA);
const collectionData = await anchorProgram.account.collectionPda.fetch(new PublicKey(collectionPDA.toString()));
Run Code Online (Sandbox Code Playgroud)
我想知道这是怎么回事。也许集合帐户结构已更新并且区块链包含旧结构?直到最近主播才开始检查这一点?
你好,我有几个问题: