私はいくつかのコマンドを並行して起動しsystem()
、ログ記録のためにそれらの結果を待つ小さなユーティリティを書いています。ただし、system()
別のスレッドで呼び出しているにもかかわらず、Activity Monitor を見ると、一度に各コマンドのインスタンスが 1 つしか表示されません。システムはミューテックスで内部的に同期されているようで、一度に 1 つの実行しか許可されていませんが、これは大きな制限のように見えます。誰かがこの動作を確認できますか? それを解決する方法についてのアイデアはありますか?
スレッドの実行フローを見て更新すると、ミューテックスで効果的に同期しているように見えます。system()
それを行わない代替手段はありますか?
Mac OS 10.7.5でC++ 11(clangとlibc ++を使用)を使用していることに言及する必要があります。
更新コードは次のとおりです。
void Batch::run()
{
done.clear();
generator->resetGeneration();
while(generator->hasMoreParameters())
{
// Lock for accessing active
unique_lock<mutex> lock(q_mutex, adopt_lock);
// If we've less experiments than threads
if (active.size() < threads)
{
Configuration conf = generator->generateParameters();
Experiment e(executable, conf);
thread t(&Experiment::run, e, reference_wrapper<Batch>(*this));
thread::id id = t.get_id();
active.insert(id);
t.detach();
}
// Condition variable
q_control.wait(lock, [this] { return active.size() < threads; } );
}
}
void Batch::experimentFinished(std::thread::id pos)
{
unique_lock<mutex> lock(q_mutex, adopt_lock);
active.erase(pos);
lock.unlock();
q_control.notify_all();
}
void Experiment::run(Batch& caller)
{
// Generate run command
stringstream run_command;
run_command << executable + " ";
ParameterExpression::printCommandLine(run_command, config);
if (system(run_command.str().c_str()))
stats["success"] = "true";
else
stats["success"] = "false";
caller.experimentFinished(this_thread::get_id());
}
明確にするために、スレッドの生成と処理は正常に機能し、必要なことをsystem()
実行しますが、一度に実行できるインスタンスは 1 つだけのようです。
ありがとう