Позвольте потокам выполняться до указанной c точки, дождитесь, пока остальные достигнуты, последовательно выполните оставшийся код - PullRequest
0 голосов
/ 03 августа 2020

У меня есть код, который нужно протестировать для нескольких алгоритмов. Но прежде чем их можно будет сравнить, им нужно подготовиться. Я хотел бы провести эту подготовку в многопоточном режиме, но тестирование должно быть последовательным. Обычно я создавал потоки для подготовки, ждал, пока они закончатся 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); 
}

Я также читал, что разветвление в потоках вызывает проблемы, будет ли это проблемой в этом коде?

Думаю, я мог бы использовать мьютекс для одновременного тестирования только одного потока, но я не хочу проводить тестирование потока, пока другие все еще готовятся.

...