1

我不知道为什么它不编译我删除了行中的评论

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

3 回答 3

4

std::thread 不可复制,因此您不能使用它调用 push_front。复制一个线程是没有意义的,它会做什么?

您也许可以使用将线程移动到列表中

waitThread.push_front(std::move(workerID));

这当然会使该行之后的线程对象无效。

然而,这条线看起来也很奇怪:-

std::thread workerID(insertList, workerID.get_id());

我怀疑在此时未构造的对象上调用 get_id 是否有效。

于 2013-02-06T13:15:49.173 回答
2

std::thread不可复制,因此您必须将其移入:

waitThread.push_front(std::move(workerID));

或者,您可以通过临时传递来移动它:

waitThread.push_front(std::thread(insertList, workerID.get_id());
于 2013-02-06T13:16:30.673 回答
1

这不是评论,而是您的程序中有效且(可能)必不可少的声明:

/*******************************/ -- comment
waitThread.push_front(workerID); -- statement
/******************************/ --comment
于 2013-02-06T13:15:43.683 回答