c++ - 使用 <list> C++ 编译时出错

标签 c++

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

/*******************************/
waitThread.push_front(workerID);
/******************************/

只有当我留下评论时,它才会编译......否则,我会得到一个以“declared here”结尾的长异常......

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

最佳答案

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

您也许可以使用

将线程移动到列表中
waitThread.push_front(std::move(workerID));

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

但是这一行看起来也很奇怪:-

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

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

关于c++ - 使用 <list> C++ 编译时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14729958/

相关文章:

c++ - 为什么使用 int64_t 会给出错误的结果,而 double 对于简单的整数乘法却按预期工作

c++ - 如何通过 C++ 可执行文件中的 list 启用 "Long Path Aware"行为?

c++ - boost C++ 库 : Unit Test Assertion on Deadlocks

c++ - 二维数组垂直翻转

c++ - 模板化 vector 的构造函数(数学类)

c++ - 在 C++ 中,我是否可以将整数指针传递给将整数数组作为参数的函数?

c++ - 使用 OpenCV 检测红色矩形(或正方形)

c++ - 我应该删除 vector <string> 吗?

c++ - 使用带有继承变量的初始化列表

c++ - 具有std::enable_if_t的模板类,静态const成员初始化