2017-07-24 288 views
-1

我有以下功能:在pthread_create:傳遞一個參數作爲最後一個參數

void Servlet(SSL* ssl) /* Serve the connection -- threadable */ 
{ char buf[1024]; 
char reply[1024]; 
int sd, bytes; 
const char* HTMLecho="<html><body><pre>%s</pre></body></html>\n\n"; 

if (SSL_accept(ssl) == FAIL)   /* do SSL-protocol accept */ 
    ERR_print_errors_fp(stderr); 
else 
{ 

    ShowCerts(ssl);        /* get any certificates */ 
    bytes = SSL_read(ssl, buf, sizeof(buf)); /* get request */ 
    if (bytes > 0) 
    { 
     buf[bytes] = 0; 
     printf("Client msg: \"%s\"\n", buf); 
     sprintf(reply, HTMLecho, buf);   /* construct reply */ 
     SSL_write(ssl, reply, strlen(reply)); /* send reply */ 
    } 
    else 
     ERR_print_errors_fp(stderr); 
    } 
    sd = SSL_get_fd(ssl);   /* get socket connection */ 
    SSL_free(ssl);         /* release SSL state */ 
    close(sd);          /* close connection */ 
    } 

,並在主要部分程序:

pthread_create(&threadA[noThread], NULL, Servlet,(SSL*)(ssl)); 

但編譯後,我看到錯誤的論點3在pthread_create!如何解決它?

+0

*「我看到錯誤說法3在pthread_create如何解決它! 「*。第一步:閱讀錯誤消息。 – user2079303

+0

錯誤消息「無效對話從void(*)(ssl *)到void *(*)(void *)[-fpermisive]」 – user8178737

+0

您應該將相關信息放入問題中。 – user2079303

回答

0

如果您查看pthread_create的聲明,您會發現第三個參數(回調)的類型爲void *(*start_routine) (void *)。這樣的函數指針可以指向void*(void*)類型的函數,即返回void*並採用類型爲void*的參數的函數。

你的功能Servlet需要SSL*而不是void*類型的參數,返回void而非void*。因此,您的功能不能轉換爲其他功能指針類型,因此您對pthread_create的呼叫格式不正確。

解決方案:使用具有正確簽名的函數。使用void*作爲參數,並返回void*

另一種方法:使用來自C++標準庫而不是pthread的std::thread。我自己

+0

tnx您的回覆。 – user8178737

0

答:

用於調用pthread_create:

pthread_create(&threadA[noThread], NULL, Servlet,(void*) ssl); 

,並開始日常的身體:

void * Servlet(void *param) 
{ 
    SSL *ssl = (SSL *)param; 
    //.. 
}