13

これは、thread_group を作成し、すべてのスレッドを並行して実行するコードです。

boost::thread_group group;
for (int i = 0; i < 15; ++i)
    group.create_thread(aFunctionToExecute);
group.join_all();

このコードは、すべてのスレッドを一度に実行します。私がやりたいことは、最大4つを除くすべてを並行して実行することです。on が終了すると、実行するものがなくなるまで別のものが実行されます。

4

4 に答える 4

3

別のより効率的な解決策は、各スレッドが終了したときにプライマリ スレッドにコールバックし、プライマリ スレッドのハンドラーが毎回新しいスレッドを起動できるようにすることです。これにより、コールバックがトリガーされるまでプライマリ スレッドは何も実行しないため、timed_join への繰り返しの呼び出しが防止されます。

于 2010-07-27T14:29:49.627 に答える
0

私はこのようなものを持っています:

    boost::mutex mutex_;
    boost::condition_variable condition_;
    const size_t throttle_;
    size_t size_;
    bool wait_;
    template <typename Env, class F>
    void eval_(const Env &env, const F &f) {
        {   
            boost::unique_lock<boost::mutex> lock(mutex_);
            size_ = std::min(size_+1, throttle_);
            while (throttle_ <= size_) condition_.wait(lock);
        }
        f.eval(env);
        {
            boost::lock_guard<boost::mutex> lock(mutex_);
            --size_; 
        }
        condition_.notify_one();
    }
于 2010-07-27T15:24:40.027 に答える