D语言 - 线程与生成

Flo*_*oss 12 multithreading d

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

所以我的问题首先是,为什么有两种完全不同的线程风格?第二,为什么他们在一起提供基本上所有你需要的东西时都是如此不完整?

Ber*_*ard 9

core.thread为线程提供基本的低级基元.std.concurrencycore.thread内部使用.A tid只能从中得到std.concurrency.spawn.

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

你不妨问一下,为什么有两种编写代码的方法,普通的D和内联汇编代码.有高(呃)水平和低水平.

第二,为什么他们在一起提供基本上所有你需要的东西时都是如此不完整?

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

为了回答你更具体的问题,它需要a function而不是a delegate因为a delegate采用了一个允许突变的上下文指针,这会破坏一些std.concurrency假设.请注意,spawn不允许具有可变间接的参数,因此no委托事物不应该令人震惊.

而不是加入,你会发送一个"停止"消息给你的线程.同样,这是更高级别,并使用更高级别的结构.

  • @Floss在任务完成后发送一个`Stopped`结构并对它执行一个recieveOnly,同样`thisTid`会给你当前线程的tid,即使它还不存在(包括主线程和任何线程已启动)用`Thread.start`) (3认同)