【问题标题】:Vector of threads线程向量
【发布时间】:2016-08-14 22:32:20
【问题描述】:

我正在尝试制作一个可以接受许多客户端的 Winsock 服务器。为了做到这一点,我被告知使用线程向量。所以这就是我想做的,但我得到了这个错误:

错误 3 错误 C2064:该术语不计算为具有 0 个参数的函数 C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\functional 1152 1 Server

而我的服务器代码是这样的:

 using namespace std;
    int __cdecl NewClient(SOCKET ListenSocket, SOCKET ClientSocket,  char *recvbuf,  int recvbuflen, int iSendResult, int iResult)
    vector<thread> thred;

    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();
    }

    int __cdecl NewClient(SOCKET ListenSocket, SOCKET ClientSocket,  char *recvbuf,  int recvbuflen, int iSendResult, int iResult){
    //things
    }

我认为错误是我试图回退新线程的地方。反推是这样用的吗?或者我该怎么办?

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • cppreference.com 说“std::thread 不是 CopyConstructible 或 CopyAssignable,尽管它是 MoveConstructible 和 MoveAssignable。”

标签: c++ multithreading vector server winsock


【解决方案1】:

回退是这样用的吗?或者我该怎么办?

cppreference.com 说“std::thread 不是 CopyConstructible 或 CopyAssignable,尽管它是 MoveConstructible 和 MoveAssignable。”

考虑:

std::vector <std::thread*> thred;  

以及相关的调整。

另外,考虑使用智能指针。

【讨论】:

  • 感谢您的回答,我的代码基于第一个示例:link,所以这不可能吗?对于std::vector &lt;std::thread*&gt; thred; ,会有哪些调整?
  • 那篇文章说它应该可以工作,但我最近的经验我不知道如何。此外,我更喜欢指针是有原因的。所以在我最近的努力中,我使用了“thread*”向量。其他调整是使用 thred[i]->join(),而不是 thred[i].join()(即取消引用指针)。使用原始指针,我的 dtor 使用 back()、pop_back() 和 delete 显式删除了每个向量元素。我认为一个线程几乎不需要调用它,所以指针真的不是问题。祝你好运。
  • 刚刚记起来,见“void push_back(T&& value);” (2)(C++11 起)。我还没试过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多