【问题标题】:how to create unkown amount of threads c++如何创建未知数量的线程c ++
【发布时间】:2015-09-03 07:59:54
【问题描述】:

我编写了一个连接到客户端的服务器 C++,我想使用线程来执行一些操作和一些客户端,而不是只做一个客户端完成并转到另一个客户端。但我不能只创建特定数量的未知数量。 有人可以帮帮我吗?

while (1)
{
    ClientSocket = INVALID_SOCKET;
    ClientSocket = accept(ListenSocket, NULL, NULL); // Accept a client socket
    if (ClientSocket == INVALID_SOCKET) //Check for errors
    {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
    }
    else
    {
        t->join();
        std::thread t(&Manager::acceptance, this,ClientSocket,ListenSocket);
        t.join();
    }
}

在接受中,我有接收和发送功能。 但它只适用于一个线程,我不知道每次有人进入时如何创建线程。 谢谢! 尼尔

【问题讨论】:

  • 您可能正在寻找“未知”以外的其他词。
  • 您可以根据需要保留您创建的所有线程的vector
  • 我的意思是无限的,当有人进入我的服务器时,我会为他创建一个新的Theard
  • 每个客户端线程模型的扩展性很差。您确实想创建一个线程池,并将任务推送到由该池提供服务的队列中。这允许您调整线程数以适应可用的处理器。
  • 如果你愿意,没有什么能阻止你动态创建线程(就像你可以在std::vector<int> 中动态创建整数一样)。但这对于服务器来说不一定是一个好主意。您可能需要线程池和/或非阻塞 I/O。

标签: c++ multithreading client server


【解决方案1】:

您可能正在执行t.join();,以避免在std::thread 对象telse 分支末尾超出范围时过早终止您的线程。但是这样一来,你的主线程就被阻塞了,你不能再创建另一个线程了。

保持线程活动的更好方法是在std::liststd::map 中创建std::thread 对象,而不是在作用域内的局部变量中。这样你仍然可以控制它,但你的线程不会过早终止:

std::list<std::thread> workers;
// ...
if (ClientSocket == INVALID_SOCKET) //Check for errors
{
    // ...
}
else
{
    workers.push_back(std::thread(&Manager::acceptance, this, ClientSocket, ListenSocket));
}

【讨论】:

  • 我可以在矢量中做吗?
  • @user3346907:vector 也可以。
  • @user3346907:正如我发布的那样,代码已经在“启动线程”的意义上“使用它”。 join 不是必需的,构造函数已经这样做了。
  • 哦我想我明白了,所以在接受功能中我需要做一些特殊的事情才能使用线程吗?或者只是接收和发送,一切都会正常
  • @user3346907:我不知道您在acceptance 中做了什么,但据我所知,它很可能仍然像以前一样工作。
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多