【问题标题】:D language - Thread vs spawnD 语言 - 线程与生成
【发布时间】:2012-02-29 19:22:13
【问题描述】:

我正在尝试使用 D 进行编程,但遇到了一些问题。我开始使用 core.thread Thread 类,它支持启动一个线程,然后将当前线程加入它。 D 似乎希望人们使用消息传递而不是锁定/同步方法,所以我想我会尝试一下,但是我看到的每个消息传递示例都需要我似乎无法从 Thread 类中获得的 tid。我在网上看到的代码示例实际上使用了 spawn ,它返回 tid 而不是使用 Thread 包装器,然后您使用 tid 将消息传递给 Thread。但是现在似乎没有任何方法可以根据其 tid 加入线程!不仅如此,您似乎无法生成委托,这需要我添加不必要的间接级别。

所以我的问题首先是,为什么会有两种完全不同的线程?其次,为什么它们在一起时却如此不完整,它们基本上可以提供您可能需要的一切?

【问题讨论】:

    标签: multithreading d


    【解决方案1】:

    core.thread 为线程提供基本的低级原语。 std.concurrency 在内部使用 core.threadtid 只能从 std.concurrency.spawn 获取。

    所以我的问题首先是,为什么会有两种完全不同的线程?

    你不妨问一下,为什么有两种写代码的方式,普通D和内联汇编代码。有高(er)级和低级。

    其次,为什么它们一起提供了你可能需要的一切,却又如此不完整?

    它们不是不完整的,但您的多线程必须设计为可以在其中一个中工作。如果std.concurrency 允许任意访问Threads 等,它做出的保证可能不会那么强。

    要回答您更具体的问题,它需要function 而不是delegate,因为delegate 需要一个上下文指针,它允许突变,这会破坏std.concurrency 的一些假设。请注意,spawn 不允许 arguments 具有可变间接性,因此没有代表的事情不应该令人震惊。

    您不会加入,而是向您的线程发送“停止”消息。同样,这是更高级别,并且使用更高级别的构造。

    【讨论】:

    • 那么我怎么知道线程何时结束呢?只是说你有一个没有做任何事情的主线程和另一个正在运行的线程。通常我只会有主调用thread.join()。由于 main 是默认线程并且没有 tid,因此我将如何通过消息传递做同样的事情,因此无法接收任何消息?
    • 使用receivereceiveOnly
    • @Floss 在任务完成时发送一个Stopped 结构并对其执行recieveOnly,thisTid 也会给你当前线程的tid,即使它还不存在(包括主线程和任何以Thread.start开头的线程)
    • @ratchetfreak 谢谢,这是有道理的。根据 Bernard 的原始解释,我假设只有以 spawn 开头的线程才能接收消息。
    • @Floss,我从来没有把这些变成教程,但这里是并发:gist.github.com/773979 和并行(当它是并行未来时:gist.github.com/774983
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多