multithreading - 两个线程,如何实现它们之间的通信。(伪代码)
问题描述
我有两个线程:
主线程:
- 主线程正在监听 HTTP 请求,
- 主线程将处理程序注册到用于长轮询的 HTTP 请求
第二个线程:
- 从不同的套接字获取数据。
- 如果它在来自套接字的数据中找到某些内容,则更新线程本地存储,并且如果主线程有 HTTP 请求未决,它会以某种方式向其发送数据。
如何使主线程和第二线程相互通信?
主线程 http 处理程序伪代码:
function mg_handler(request){
var handle = parseHandle(request.data);
var storage_name = parseStorageName(request.data);
var response = WaitForResponse(handle,storage_name);
mg_printf(rasponse);
return;
}
第二个线程伪代码:
var storage
function t_run()
{
var buf
while(1){
recvfrom(socket,buf);
var result;
bool found_something = search(buf,result);
if(found_something){
update(storage,result);
//if WaitForResponse is waiting let it continue by sending storage to it somehow.
//???
}
}
cleanup:
return;
}
解决方案
在您的场景中,任何线程之间都没有通信。通信意味着例如一个线程控制另一个线程的执行。在您的情况下,您只是共享数据(或者更精确地保存数据的内存)。
请注意,您必须提供同步机制才能同步对共享内存的并发访问。否则,您将遇到多线程通常带来的所有并发问题,尤其是在涉及共享内存时。
大多数支持多线程的语言也支持编译器级别的同步。
// Shared resources.
// Requires some synchronization mechanism for thread-safe access...
shared_pending_http_request_flag;
shared_data_variable;
function main()
{
// Main thread context
startBackgroundThread();
listenToHttpRequests();
}
function startBackgroundThread()
{
// Background thread context
result_data := readDataFromSocket();
IF
main thread has set shared variable shared_pending_http_request_flag
THEN
shared_data_variable := result_data ;
}
function listenToHttpRequests()
{
// Main thread context
WHILE
listening to HTTP requests
DO
IF
there is a pending request
THEN
set the shared_pending_http_request_flag;
IF
shared_pending_http_request_flag AND shared_data_variable are both set
THEN
handle value of shared_data_variable;
}
对于面向对象的语言或任何支持回调或方法引用的语言,您应该实现观察者模式。这消除了轮询更改的需要,因为 observable 可以简单地通知观察者有关更改。通常,observable 调用由观察者注册的回调。
推荐阅读
- python - 将图像对象添加为 Plotly 图例条目
- java - 有没有办法利用 Jackson ObjectMapper 从 JSON 中逐个读取对象
- python - python中的子列表列表
- css - Bootstrap 手风琴表不适用于 Laravel 项目
- ios - 我的应用使用相机功能再次被 Apple 拒绝(法律 - 隐私 - 数据收集和存储)
- javascript - 尝试在 vsCode 中为 Mozilla 调试器设置配置时出现端口错误
- magento - 单个产品详细信息显示在主页而不是主页 magento 2
- angular - 基本角度
- r - 如何在 R 中为 [-10:10] 绘制 x^2?
- azure - 如何将应用注册客户端 ID 放入 Azure AD 令牌?