我不知道为什么它不编译我删除行中的注释
/*******************************/
waitThread.push_front(workerID);
/******************************/
只有当我离开评论时,它才会编译......否则,我会得到一个长期的例外,以“在这里声明”结束......
/usr/include/c++/4.6/thread:126:5: error: declared here
也许定义有一些问题...... 你能解释一下吗?
/* g++ -std=c++0x -o manyThreads manyThreads.cpp -pthread */
#include <thread>
#include <iostream>
#include <mutex>
#include <time.h>
#include <list>
std::list<std::thread::id> myList;
std::mutex mutex;
std::list<std::thread> waitThread;
void insertList(std::thread::id identifier) {
mutex.lock();
myList.push_front(identifier);
mutex.unlock();
}
int main() {
std::list<std::thread::id>::iterator id;
std::list<std::thread>::iterator threadsIter;
int counter;
for(counter=0; counter<6; counter++) {
std::thread workerID(insertList, workerID.get_id());
/*******************************/
waitThread.push_front(workerID);
/******************************/
}
for(threadsIter=waitThread.begin(); threadsIter !=waitThread.end();threadsIter++) {
threadsIter->join();
}
for(id=myList.begin(); id != myList.end(); id++) {
std::cout << *id << "\n";
}
return 0;
}
答案 0 :(得分:4)
std :: thread不可复制,因此您无法使用它调用push_front。复制一个线程没有意义,它会做什么?
您可以使用
将线程移动到列表中waitThread.push_front(std::move(workerID));
当然会使该行之后的线程对象无效。
然而,这条线看起来也很奇怪: -
std::thread workerID(insertList, workerID.get_id());
我怀疑在当时没有构造的对象上调用get_id是有效的。
答案 1 :(得分:2)
std::thread
不可复制,因此您必须将其移入:
waitThread.push_front(std::move(workerID));
或者,您可以通过传递临时来移动它:
waitThread.push_front(std::thread(insertList, workerID.get_id());
答案 2 :(得分:1)
这不是评论,而是程序中有效且(可能)必要的陈述:
/*******************************/ -- comment
waitThread.push_front(workerID); -- statement
/******************************/ --comment