gpt4 book ai didi

multithreading - D中的 "this"指针和消息接收

转载 作者:行者123 更新时间:2023-12-03 12:55:57 25 4
gpt4 key购买 nike

D 多线程模型不允许隐式内存共享,更喜欢消息传递和不可变数据。然而,编译器似乎对让 this 感到奇怪。接收消息时指针通过:

import std.concurrency;
import std.stdio;

class Wat {

int foo;
Tid workerThread;

this(int f)
{
foo = f;
workerThread = spawn(&threadedWork);
}

// Must be static. This makes sense because otherwise
// the object (via "this") would be accessible in two threads,
// and D discourages shared memory,
// preferring messages and immutable data.
static void threadedWork()
{
// Compiler correctly complains that I can't access a non-static function
// from inside a static one.
bar(42);

while (true) {
// But this is allowed. What gives?
receive (
&bar
);
}
}

void bar(int bar)
{
if (foo == bar)
writeln("The answer");
}
}

为什么编译器允许我在 receive 中使用非静态函数?这是一个错误吗?

最佳答案

看起来像一个错误。发生的事情是 &bar 为您提供一个指向没有 this 的方法的指针,该方法的类型为函数指针:

pragma(msg, typeof(&Wat.bar));
void function(int bar)

std.concurrency.receive 然后看到并说“哦,它是 int 消息的处理程序”并接受它......没有意识到它还需要一个隐藏的 this 参数传递给它。

如果您尝试使用它,如果它尝试访问任何类成员,您将获得随机结果/崩溃,因为 this 指针实际上并未传递给函数,因此它访问随机垃圾,

所以虽然我会说这是一个错误......我不确定是不是这个错误。 std.concurrency 无法区分真正的 void 函数(int)和这个假函数之间的区别,因为地址运算符不转发有关隐藏的 this 指针的信息。我认为这是真正的错误。

关于multithreading - D中的 "this"指针和消息接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21765885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com