首页 > 解决方案 > 两个线程,如何实现它们之间的通信。(伪代码)

问题描述

我有两个线程:

  1. 主线程:

    • 主线程正在监听 HTTP 请求,
    • 主线程将处理程序注册到用于长轮询的 HTTP 请求
  2. 第二个线程:

    • 从不同的套接字获取数据。
    • 如果它在来自套接字的数据中找到某些内容,则更新线程本地存储,并且如果主线程有 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;
 }

标签: multithreadingdesign-patternsconcurrency

解决方案


在您的场景中,任何线程之间都没有通信。通信意味着例如一个线程控制另一个线程的执行。在您的情况下,您只是共享数据(或者更精确地保存数据的内存)。

请注意,您必须提供同步机制才能同步对共享内存的并发访问。否则,您将遇到多线程通常带来的所有并发问题,尤其是在涉及共享内存时。
大多数支持多线程的语言也支持编译器级别的同步。

// 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 调用由观察者注册的回调。


推荐阅读