无需等待即可从一个线程发送消息到另一个线程
Sending messages from thread to thread without waiting
我有一个程序有 2 个线程,1 个用于 GUI,另一个用于后台工作。它是一个服务器,需要一个 GUI(无法解释原因),并且它向 GUI 报告一些传入缓冲区。为此,工作线程一直是 运行,不能暂停,否则客户端将超时。
所以问题是:我无法弄清楚如何 send/receive 来自线程的消息,无需等待。类似于:检查消息是否到达(每 1000 毫秒),如果是,则该消息包含一个字符串,该字符串必须 'pushed' 到 GUI,如果没有,请继续。而且这在 GUI 中运行,所以它不能等待,否则 OS 将 'think' 程序没有响应。
D 中的发送和接收等待消息到达,这是我不想要的。
我试过的:
在模块的命名空间中声明一个变量,然后主线程和工作线程都可以访问它。类似于:
import std.concurrency;
import std.stdio;
ubyte someVar;
void main(){
//main thread:
//spawn child thread
writeln("someVar in thread#0:",&someVar);
spawn(&childThread);
}
void childThread(){
writeln("someVar in thread#1:",&someVar);
}
但是,我发现,使用上面的代码,每个线程都有自己的 someVar
。
我尝试的其他方法:
我尝试在启动线程后立即将指向 someVar
的指针(来自上面的示例)作为消息发送给工作线程,并在工作线程启动后立即在工作线程中接收消息(因此不会遗漏任何消息)。但是,我发现在 D 中不允许传递线程本地数据。
总结一下:如何在线程之间传递消息(字符串),而不让接收线程等待消息?
BUT, I've found out, using the code above, that each thread gets to have its own someVar.
在 D 中,变量是 thread-local,除非它们被标记为 shared
。因此,如果您想使用这样的变量来共享数据,您必须将其声明为 shared
并适当地处理锁定变量。如果你真的想这样做,我建议阅读
http://ddili.org/ders/d.en/concurrency_shared.html
但是,std.concurrency 的设计考虑了消息传递,它具有 send
和 receive
功能,避免了 shared
的需要。 receive
在等待消息时阻塞,但您可以改用 receiveTimeout
,并且根据文档,如果超时为负,则根本不会等待。如果您想走那条路(这是在 D 中处理线程相互通信的推荐方法),那么我建议您阅读以下内容:
我有一个程序有 2 个线程,1 个用于 GUI,另一个用于后台工作。它是一个服务器,需要一个 GUI(无法解释原因),并且它向 GUI 报告一些传入缓冲区。为此,工作线程一直是 运行,不能暂停,否则客户端将超时。
所以问题是:我无法弄清楚如何 send/receive 来自线程的消息,无需等待。类似于:检查消息是否到达(每 1000 毫秒),如果是,则该消息包含一个字符串,该字符串必须 'pushed' 到 GUI,如果没有,请继续。而且这在 GUI 中运行,所以它不能等待,否则 OS 将 'think' 程序没有响应。
D 中的发送和接收等待消息到达,这是我不想要的。
我试过的:
在模块的命名空间中声明一个变量,然后主线程和工作线程都可以访问它。类似于:
import std.concurrency;
import std.stdio;
ubyte someVar;
void main(){
//main thread:
//spawn child thread
writeln("someVar in thread#0:",&someVar);
spawn(&childThread);
}
void childThread(){
writeln("someVar in thread#1:",&someVar);
}
但是,我发现,使用上面的代码,每个线程都有自己的 someVar
。
我尝试的其他方法:
我尝试在启动线程后立即将指向 someVar
的指针(来自上面的示例)作为消息发送给工作线程,并在工作线程启动后立即在工作线程中接收消息(因此不会遗漏任何消息)。但是,我发现在 D 中不允许传递线程本地数据。
总结一下:如何在线程之间传递消息(字符串),而不让接收线程等待消息?
BUT, I've found out, using the code above, that each thread gets to have its own someVar.
在 D 中,变量是 thread-local,除非它们被标记为 shared
。因此,如果您想使用这样的变量来共享数据,您必须将其声明为 shared
并适当地处理锁定变量。如果你真的想这样做,我建议阅读
http://ddili.org/ders/d.en/concurrency_shared.html
但是,std.concurrency 的设计考虑了消息传递,它具有 send
和 receive
功能,避免了 shared
的需要。 receive
在等待消息时阻塞,但您可以改用 receiveTimeout
,并且根据文档,如果超时为负,则根本不会等待。如果您想走那条路(这是在 D 中处理线程相互通信的推荐方法),那么我建议您阅读以下内容: