无需等待即可将消息从线程发送到线程

时间:2017-02-08 11:41:51

标签: multithreading user-interface thread-safety d

我有一个程序有2个线程,1个用于GUI,另一个用于后台工作。它是一个服务器,需要一个GUI(无法解释原因),并向GUI报告一些传入的缓冲区。为此,工作线程一直在运行,无法暂停,或客户端将超时。

所以问题是:我无法弄清楚如何从线程发送/接收消息,而无需等待。类似于:检查消息是否到达(每1000毫秒),如果是,则该消息包含必须“推送”到GUI的字符串,如果没有,继续。这在GUI中运行,因此它不能等待,或者操作系统会“认为”程序没有响应 D中的发送和接收等待消息到达,这是我不想要的。

我尝试了什么:
在模块的命名空间中声明一个变量,然后主线程和worker都可以访问它。类似的东西:

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中不允许传递线程本地数据。

总结一下:如何将消息(字符串)从线程传递给线程,而不是让接收线程等待消息?

1 个答案:

答案 0 :(得分:2)

  

但是,我发现,使用上面的代码,每个线程都拥有自己的someVar。

在D中,变量是线程本地的,除非它们被标记为shared。因此,如果您想使用这样的变量来共享数据,您必须将其声明为shared并处理适当的锁定变量。如果你真的想这样做,我建议你阅读

http://ddili.org/ders/d.en/concurrency_shared.html

但是,std.concurrency的设计考虑了消息传递,并且它具有sendreceive函数,因此无需sharedreceive在等待邮件时阻塞,但您可以使用receiveTimeout代替,并且根据文档,如果超时为负,则根本不会等待。如果你想走那条路(这是处理在D中互相交谈的线程的推荐方法),那么我建议你读这个:

http://ddili.org/ders/d.en/concurrency.html