Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 两个线程,如何实现它们之间的通信。(伪代码)_Multithreading_Design Patterns_Concurrency - Fatal编程技术网

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请求,它会以某种方式向它发送数据
  • 如何使主线程和第二线程相互通信

    主线程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注册的回调。

    您可以使用发布者-订阅者模式。我不知道如何将发布者-订阅者模式融入其中。