【发布时间】:2017-06-26 00:18:52
【问题描述】:
我有一个程序有 2 个线程,1 个用于 GUI,另一个用于后台工作。它是一个服务器,需要一个 GUI(无法解释为什么),它会向 GUI 报告一些传入的缓冲区。为此,工作线程一直在运行,不能暂停,否则客户端将超时。
所以问题是:我不知道如何在不等待的情况下从线程发送/接收消息。例如:检查是否有消息到达(每 1000 毫秒),如果是,则该消息包含一个必须“推送”到 GUI 的字符串,如果没有,继续。这在 GUI 中运行,所以它不能等待,否则操作系统会“认为”程序没有响应。
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 中不允许传递线程本地数据。
总结一下:如何在线程之间传递消息(字符串),而不让接收线程等待消息?
【问题讨论】:
-
在您的示例中,您可能希望将
someVar标记为__gshared。 -
@sigod
__gshared仅用于绑定到 C 全局变量。您可以用它标记 D 变量,但类型系统会将其视为线程本地的,您可能会得到不正确的行为。尽管很烦人,但想要共享变量的 D 代码确实需要使用shared。
标签: multithreading user-interface thread-safety d