class ThreadClass
{
public:
//void SendUpdatePackage(int stationNum, int &nResult, string &szErrMsg, std::vector<sockaddr_in> &BSAddrVector);
int Print(int stationnum)
{
return stationnum;
}
private:
//std::mutex m_SFTPMutex;
};
int main()
{
std::vector<std::thread> sftpThreadVec;
int nResult = 0;
ThreadClass tc;
for (int i = 0; i < nThreadNum; i++)
{
thread my_thread(&ThreadClass::Print, &tc, i);
sftpThreadVec.push_back(my_thread);
}
for (auto &a : sftpThreadVec)
a.join();
return 0;
}
这里 报错 “std::thread::thread(const std::thread &)”: 尝试引用已删除的函数
查看 thread 源码看到下面这行
thread(const thread&) = delete;
这里是禁用了thread的拷贝构造
而 std::vector 和 std::map 都是要求 类型 必须包含拷贝构造函数
可以这样
int nResult = 0;
ThreadClass tc;
std::thread thArr[4];
for (int i = 0; i < 4; i++)
{
thArr[i] = std::thread(&ThreadClass::Print, &tc, i);
}
for (auto &a : thArr)
a.join();
经验证,这样也可以
vector<thread> thVec;
for (int i = 0; i < nThreadNum; i++)
{
//sftpThreadArr[i] = thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg);
thVec.push_back(thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg));
}
这种写法会报错,先实例化一个 thread对象,然后把这个对象push_back进 vector 会报这个错误
vector<thread> thVec;
for (int i = 0; i < nThreadNum; i++)
{
//sftpThreadArr[i] = thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg);
thread ts = thread(&ThreadClass::SendUpPkg, &tc, i, pMainDlg);
thVec.push_back(ts);
}