4

基本的に私がやりたいことは、複数のスレッドを生成する for ループを書くことです。スレッドは特定の関数を複数回呼び出す必要があります。言い換えれば、各スレッドが異なるオブジェクトで同じ関数を呼び出す必要があります。std::thread c++ ライブラリを使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

10

ループ内にスレッドを作成し、毎回異なる引数を渡すだけです。この例では、vector後で結合できるように に格納されています。

struct Foo {};

void bar(const Foo& f) { .... };

int main()
{
  std::vector<std::thread> threads;
  for (int i = 0; i < 10; ++i)
    threads.push_back(std::thread(bar, Foo()));

  // do some other stuff

  // loop again to join the threads
  for (auto& t : threads)
    t.join();
}
于 2013-10-30T06:18:28.503 に答える
0

ループを作成し、各反復で個別のスレッド オブジェクトを構築します。すべて同じ関数ですが、引数として異なるオブジェクトを使用します。

于 2013-10-30T06:18:02.800 に答える
0

C++11 の一部を使用し、std::function + std::bind の強力な機能を利用したい場合は、次のように試すことができます。

#include <thread>
#include <functional>
#include <iostream>
#include <vector>
#include <memory>

typedef std::function<void()> RunningFunction;

class MyRunner 
{
private:
    MyRunner(const MyRunner&);
    MyRunner& operator=(const MyRunner&);
    std::vector<std::thread> _threads;

public:

    MyRunner(uint32_t count, RunningFunction fn) : _threads()
    {
        _threads.reserve(count);
        for (uint32_t i = 0; i < count; ++i)
            _threads.emplace_back(fn);
    }

    void Join()
    {
        for (std::thread& t : _threads)
            if (t.joinable())
                t.join();
    }
};

typedef std::shared_ptr<MyRunner> MyRunnerPtr;

class Foo
{
public:
    void Bar(uint32_t arg)
    {
        std::cout << std::this_thread::get_id() << " arg = " << arg << std::endl;
    }
};


int calcArg()
{
    return rand() % UINT32_MAX;
}

int main(int argc, char** argv)
{
    std::vector<Foo> objs;

    for (uint32_t i = 0; i < 32; ++i)
        objs.emplace_back(Foo());

    std::vector<MyRunnerPtr> runners;

    for (Foo& obj : objs)
    {
        const uint32_t someArg = calcArg();
        runners.emplace_back(std::make_shared<MyRunner>(1, std::bind(&Foo::Bar, &obj, someArg)));
    }

    for (MyRunnerPtr& runner : runners)
        runner->Join();
}
于 2013-10-30T07:03:49.497 に答える