0

私のコードでは、クラスのオブジェクトの束を作成し、各オブジェクトに個別のスレッドを与えて、オブジェクトがすべて同時にアクションを実行できるようにしたいと考えています。

for (i = 0; i < ROBOTCOUNT; i++)
{
    Robot* r = new Robot;
    boost::thread t(r);
    robotList.push_back(r);
}

上記のコードのようなことをしたいです。そのような場合、コードはコンパイルされませんが、それは私が望むものの一般的な考えです。誰かが私がやりたいことをする方法を知っていますか?

ありがとう

4

1 に答える 1

3

次のコードはC++11で機能し、複数Worker::foo()のを並行して実行する必要があります。

#include <thread>
#include <memory>
#include <vector>

struct Worker
{
    void foo();
};

int main()
{
    std::vector<std::unique_ptr<Worker>> workers;
    std::vector<std::thread>             threads;

    workers.reserve(N);
    threads.reserve(N);

    for (unsigned int i = 0; i != N; ++i)
    {
        workers.emplace_back(new Worker);
        threads.emplace_back(&Worker::foo, workers.back().get());
    }

    // ... later ...

    for (auto & t : threads) { t.join(); }
}

要素参照が有効であり続けると信頼できる場合は、一意のポインターがなくても実行できます。

std::deque<Worker> workers;

// ...

for (unsigned int i = 0; i != N; ++i)
{
    workers.emplace_back(); // pray this doesn't invalidate
    threads.emplace_back(&Worker::foo, std::ref(workers.back()));
}
于 2012-08-23T01:23:48.367 に答える