【问题标题】:Creating a thread(out of a vector) of a function with arguments使用参数创建函数的线程(从向量中)
【发布时间】:2016-08-17 05:38:34
【问题描述】:

我在使用线程向量时遇到了问题。我想为服务器中的每个客户端创建一个线程。所以我有一个名为 NewClient 的函数,一旦连接开始,就会为客户端做所有必要的事情。这个函数是这样定义的:

  int __cdecl NewClient(SOCKET ListenSocket, SOCKET ClientSocket,  char *recvbuf,  int recvbuflen, int iSendResult, int iResult){
//read command from client
//execute command
//answer the server
}

还有这样的线程向量:

vector<thread> thred;

所以当我使用 pushback 在 main 中创建线程时,问题就来了:

int __cdecl main(void) {

            //things
             SOCKET ListenSocket=INVALID_SOCKET;
             SOCKET ClientSocket=INVALID_SOCKET;
             char recvbuf[DEFAULT_BUFLEN];
             int recvbuflen = DEFAULT_BUFLEN;
             int iSendResult=0;
             int iResult;
            thred.push_back(thread(NewClient,ListenSocket, ClientSocket, recvbuf, recvbuflen, iSendResult, iResult));
            thred[thred.size()-1].detach();
    }

使用时(据我所知是这样使用的):

thred.push_back(thread(NewClient,ListenSocket, ClientSocket, recvbuf, recvbuflen, iSendResult, iResult));

我得到两个错误,下划线:

错误 2 错误 C2661: 'std::thread::thread' : ninguna 函数 sobrecargada acepta 7 argumentos D:\Descargas\Baaer 1.0.22\Baaer 1.0.22\Server\Server\Source_s.cpp 170 1个服务器

3 IntelliSense:ninguna instancia del 构造函数 “std::thread::thread”与 con la lista de argumentos 不谋而合 los tipos de argumento son: (int __cdecl (SOCKET ListenSocket, SOCKET ClientSocket, char *recvbuf, int recvbuflen, int iSendResult, int iResult), SOCKET, SOCKET, char [512], int, int, int) d:\Descargas\Baaer 1.0.22\Baaer 1.0.22\Server\Server\Source_s.cpp 170 19 服务器

那我该如何解决呢?

【问题讨论】:

    标签: multithreading function vector arguments push-back


    【解决方案1】:

    简化示例:

    Live On Coliru

    #include <thread>
    #include <vector>
    #include <string>
    #include <iostream>
    
    void foo(int, double, std::string, bool) {
        std::cout << "foo\n";
    }
    
    int main() {
        std::vector<std::thread> threads;
        threads.reserve(10);
    
        threads.emplace_back(foo, 42, 3.14,  "string", false);
        threads.emplace_back(foo, 52, 13.14, "data",   true);
    
        for (auto& th : threads)
            if (th.joinable()) 
                th.join();
    }
    

    打印

    foo
    foo
    

    【讨论】:

    • 感谢您的回答,我试过了,但给出了 C2660 错误。并说:'std::vector<_ty>::emplace_back' 该函数不接受 7 个参数
    猜你喜欢
    • 2022-01-22
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多