2011-04-07 123 views
2

有没有一种方法让存根/骨架编译器生成线程服务(即通过为每个请求或线程池产生一个线程)还是必须手动添加soap_copy(),pthread_create() ...多线程gSOAP服务

我知道 - 根据FAQ和用户指南7.2.4 - gSOAP是线程安全的并且支持多线程服务。然而,使用soapcpp2 -i标志我结束了

int DummyService::run(int port) 
{ 
    if (soap_valid_socket(bind(NULL, port, 100))) 
    { 
     for (;;) 
     { 
      if (!soap_valid_socket(accept())) 
       return this->error; 
      (void)serve(); 
      soap_destroy(this); 
      soap_end(this); 
     } 
    } 
    else 
     return this->error; 

    return SOAP_OK; 
} 

任何提示?

回答

3

这可能不是您的具体要求直接治疗,但它是接近我能找到...(从http://www.cs.fsu.edu/~engelen/soapdoc2.html#sec:mt剪辑)

下面的例子演示了使用线程来提高质量服务由独立的线程处理新的要求:

#include "soapH.h" 
#include <pthread.h> 
#define BACKLOG (100) // Max. request backlog 
int main(int argc, char **argv) 
{ 
    struct soap soap; 
    soap_init(&soap); 
    if (argc < 2) // no args: assume this is a CGI application 
    { 
     soap_serve(&soap); // serve request, one thread, CGI style 
     soap_destroy(&soap); // dealloc C++ data 
     soap_end(&soap); // dealloc data and clean up 
    } 
    else 
    { 
     soap.send_timeout = 60; // 60 seconds 
     soap.recv_timeout = 60; // 60 seconds 
     soap.accept_timeout = 3600; // server stops after 1 hour of inactivity 
     soap.max_keep_alive = 100; // max keep-alive sequence 
     void *process_request(void*); 
     struct soap *tsoap; 
     pthread_t tid; 
     int port = atoi(argv[1]); // first command-line arg is port 
     SOAP_SOCKET m, s; 
     m = soap_bind(&soap, NULL, port, BACKLOG); 
     if (!soap_valid_socket(m)) 
     exit(1); 
     fprintf(stderr, "Socket connection successful %d\n", m); 
     for (;;) 
     { 
     s = soap_accept(&soap); 
     if (!soap_valid_socket(s)) 
     { 
      if (soap.errnum) 
      { 
       soap_print_fault(&soap, stderr); 
       exit(1); 
      } 
      fprintf(stderr, "server timed out\n"); 
      break; 
     } 
     fprintf(stderr, "Thread %d accepts socket %d connection from IP %d.%d.%d.%d\n", i, s, (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF); 
     tsoap = soap_copy(&soap); // make a safe copy 
     if (!tsoap) 
      break; 
     pthread_create(&tid, NULL, (void*(*)(void*))process_request, (void*)tsoap); 
     } 
    } 
    soap_done(&soap); // detach soap struct 
    return 0; 
} 
void *process_request(void *soap) 
{ 
    pthread_detach(pthread_self()); 
    soap_serve((struct soap*)soap); 
    soap_destroy((struct soap*)soap); // dealloc C++ data 
    soap_end((struct soap*)soap); // dealloc data and clean up 
    soap_done((struct soap*)soap); // detach soap struct 
    free(soap); 
    return NULL; 
} 

注:该代码不会等待线程加入在程序终止主线程。

在上面的链接中引用的文档的同一区域中还有其他线程信息。它至少可以为您寻找解决方案提供一个起点。

Regards,Ryyker