gpt4 book ai didi

multithreading - 在线程之间发送消息而无需等待

转载 作者:行者123 更新时间:2023-12-03 12:59:34 24 4
gpt4 key购买 nike

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

总而言之:如何在线程之间传递消息(字符串),而不让接收线程等待消息?

最佳答案

BUT, I've found out, using the code above, that each thread gets to have its own someVar.



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

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

然而,std.concurrency 在设计时考虑到了消息传递,它有 sendreceive正是为了这个功能,避免了对 shared 的需求. receive等待消息时阻塞,但您可以使用 receiveTimeout相反,根据文档,如果超时为负,则根本不会等待。如果你想走那条路(这是在 D 中处理线程相互交谈的推荐方法),那么我建议你阅读以下内容:

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

关于multithreading - 在线程之间发送消息而无需等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42112142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com