Multithreading 两个线程,如何实现它们之间的通信。(伪代码)
我有两条线索:Multithreading 两个线程,如何实现它们之间的通信。(伪代码),multithreading,design-patterns,concurrency,Multithreading,Design Patterns,Concurrency,我有两条线索: 主线程: 主线程正在侦听HTTP请求 主线程将处理程序注册到用于长轮询的HTTP请求 第二个线程: 从不同的套接字获取数据 如果它在套接字的数据中发现了什么,则更新线程本地存储, 若主线程有挂起的HTTP请求,它会以某种方式向它发送数据 如何使主线程和第二线程相互通信 主线程http处理程序伪代码: function mg_handler(request){ var handle = parseHandle(request.data); var stor
- 主线程正在侦听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;
}
第二个线程伪代码:
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;
}
对于面向对象语言或任何支持回调或方法引用的语言,您应该实现Observer模式。这样就不需要轮询更改,因为被观察者可以简单地将更改通知观察者。通常,observable会调用由observable注册的回调。您可以使用发布者-订阅者模式。我不知道如何将发布者-订阅者模式融入其中。