Я пытаюсь использовать OpenMP для потоковой обработки, поскольку это кросс-платформа. Однако я не могу решить, как сделать код после продолжения параллели, пока цикл работает? Он в основном просто выполняет первый цикл параллельно, но никогда не попадает во второй непараллельный цикл?OpenMP запускает потоки, но продолжает main
int main() {
#pragma omp parallel
while(1) {
Sleep(4000);
printf("doing work in thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
}
while (1) {
Sleep(4000);
printf("Hello from main %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
}
}
вы не можете иметь рабочий поток работает после окончания «OMP параллельны» области (в вашем примере параллельной область первая «в то время как () {...} '. В конце параллельной области есть невидимый барьер (незадолго до второго). – osgx
На самом деле, OpenMP - это плохой выбор для того, что вы хотите. Это не «другая потоковая библиотека», это другое решение с его собственными правилами. Лучшим решением было бы запустить отдельный поток (который мог бы использовать OpenMP), и позволить основному потоку перейти к «непараллельному» циклу. Более подробный ответ: pos если вы опишете пример использования более подробно. –
@ АлексейКуканов, я согласен, но OpenMP имеет преимущества, описанные в вопросе. –