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 に答える