使用<list> C ++ </list>进行编译时出错

时间:2013-02-06 13:12:05

标签: c++

我不知道为什么它不编译我删除行中的注释

/*******************************/
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;
}

3 个答案:

答案 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