У меня есть код, который нужно протестировать для нескольких алгоритмов. Но прежде чем их можно будет сравнить, им нужно подготовиться. Я хотел бы провести эту подготовку в многопоточном режиме, но тестирование должно быть последовательным. Обычно я создавал потоки для подготовки, ждал, пока они закончатся sh с помощью соединения, и позволил бы выполнить тестирование в основном потоке. Однако подготовка и тестирование выполняются в отдельном процессе после форка, потому что иногда подготовка и тестирование могут занять слишком много времени. (Таким образом, существует также процесс таймера, созданный вилкой, который завершает другой процесс через x секунд.) И подготовка и тестирование должны выполняться в одном и том же процессе, иначе тестирование не будет работать. Поэтому мне было интересно, создаю ли я поток для каждого алгоритма, если есть способ позволить им работать одновременно до определенной точки, а затем позволить им всем подождать, пока другие не достигнут этой точки, а затем позволить им выполнить остальную работу последовательно.
Вот код, который будет выполняться в потоке:
void prepareAndBenchmark(algorithm) {
//The timer thread that stops the worker after x seconds
pid_t timeout_pid = fork();
if (timeout_pid == 0) {
sleep(x);
_exit(0);
}
//The actual work
pid_t worker_pid = fork();
if (worker_pid == 0) {
//Concurrently:
prepare(algorithm)
//Concurrently up until this point
//At this point all the threads should run sequentially one after the other:
double result = benchmark(algorithm)
exit(0);
}
int status;
pid_t exited_pid = wait(&status);
if (exited_pid == worker_pid) {
kill(timeout_pid, SIGKILL);
if(status == 0) {
//I would use pipes to get the result of the benchmark.
} else {
//Something went wrong
}
} else {
//It took too long.
kill(worker_pid, SIGKILL);
}
wait(NULL);
}
Я также читал, что разветвление в потоках вызывает проблемы, будет ли это проблемой в этом коде?
Думаю, я мог бы использовать мьютекс для одновременного тестирования только одного потока, но я не хочу проводить тестирование потока, пока другие все еще готовятся.