Перейти к окончанию квантов времени

Можно ли перейти к концу выделенного процессу кванта времени? У меня есть программа, которая работает параллельно на части общей памяти, а затем все процессы должны дождаться завершения и синхронизации других процессов перед следующим шагом. Каждый процесс будет выполнять максимум на одну итерацию больше, чем любой другой, поэтому любые временные различия минимальны.

microsleep почти работает, но я почти уверен, что даже usleep(1) займет больше времени, чем мне хотелось бы (на данный момент я могу выполнить 5000 раз примерно за 1,5 секунды, так что это добавит к тесту около 20 мс).

Какое-то занятое ожидание кажется плохой идеей, хотя это то, с чем я могу в конечном итоге пойти.

Чего бы я действительно хотел, так это чего-то вроде

while(*everyoneDone != 0) {
    //give up rest of this time-quantum
}

Это не должно быть в реальном времени, это просто должно быть быстро. Любые идеи?

Обратите внимание, что это будет выполняться на многопроцессорной машине, потому что, если есть только одно ядро ​​для работы, существующая однопоточная версия будет работать лучше.


person zebediah49    schedule 25.06.2010    source источник


Ответы (2)


Не делайте этого, активное ожидание почти всегда является плохой идеей в контексте приложения. Используйте pthread_barrier_t, это именно тот инструмент, который предназначен для вашей цели.

person Jens Gustedt    schedule 25.06.2010
comment
Я знаю, что это плохая идея; вот почему я ищу альтернативное решение. Я просто не мог найти это, кажется, так как это похоже именно на то, что я действительно хочу. - person zebediah49; 25.06.2010
comment
да, без обид, не делайте этого, я нацелен на другой ответ на выход. - person Jens Gustedt; 25.06.2010
comment
Да, я полностью согласен (поэтому я добавил второй абзац в свой ответ). Было неясно, какой именно примитив синхронизации нужен OP (барьеры подразумевают, что вы заранее знаете, какой поток будет завершен последним). - person caf; 26.06.2010

Вы не указываете, с какой ОС вы работаете, но если это POSIX, то sched_yield() может быть тем, что вы ищете.

На самом деле, вам почти наверняка лучше использовать правильный примитив синхронизации, такой как семафор.

person caf    schedule 25.06.2010
comment
Это именно то, что я искал, но я действительно ищу это только потому, что не знал о pthread_barrier_t, который, кажется, мне действительно нужен. О, и мне пришлось использовать семафор, чтобы синхронизировать доступ к общему статусу int. Это было некрасиво. - person zebediah49; 25.06.2010