Многопоточность в C не работает на одноядерном процессоре? - PullRequest
0 голосов
/ 04 января 2010

Итак, я просто запустил пример с этого веб-сайта и он говорит, что вывод должен чередоваться следующим образом:

threadFunc says: processing...
main() is running...
threadFunc says: processing...
main() is running...

Однако на моей машине это выдает:

threadFunc says: processing...
threadFunc says: processing...
main() is running...
main() is running...

Это потому, что у меня одноядерный процессор, который не является многопоточным?

Примечание: Я также получаю это предупреждение при компиляции: implicit declaration of function ‘usleep’

Я компилирую с gcc так: gcc new.c -o new -lpthread

Ответы [ 6 ]

3 голосов
/ 04 января 2010

Вы должны закомментировать строку:

pthread_join(pth, NULL /* void ** return value could go here */);

Выполнение этого сделает все так, как вы ожидаете

Что заставляет поток ждать, пока поток pth не завершится, прежде чем продолжить.

3 голосов
/ 04 января 2010

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

Все это не имеет ничего общего с тем фактом, что ваш процессор является одноядерным. Многопоточность работала хорошо до того, как были задуманы многоядерные процессоры.

Если вы хотите чередовать выходные данные так, как вы описываете, вам нужно использовать какой-то механизм синхронизации, такой как критический раздел или мьютекс.

1 голос
/ 04 января 2010

Нет, использование usleep не является гарантированным способом переназначения вашей темы.Даже sched_yield не собирается ничего делать.Если у вас должно быть попеременное выполнение, вы должны использовать условную переменную или другой механизм сигнализации.Обратите внимание, что просто использование мьютекса тоже не поможет, так как не обязательно перепланирует.

0 голосов
/ 04 января 2010

Что делается в этих темах? Одноядерный процессор должен делиться таймшерами (менять местами) выполнение потоков. Это зависит от вашей ОС и от того, как работает ее планировщик (и от того, спите ли вы в потоке или нет).

0 голосов
/ 04 января 2010

Это все еще должно быть многопоточным правильно; попробуйте поиграть с количеством итераций цикла и / или временем в вызовах usleep(). Возможно, ваш планировщик ведет себя по-другому или выходная буферизация в вашей системе отличается.

0 голосов
/ 04 января 2010

Многопоточность напрямую не связана с количеством ядер на машине: вы можете очень хорошо реализовать многопоточность на одном процессоре.

Вывод, который вы видите, вероятно, связан с тем, как потоки чередуются планировщиком потоков / процессов ОС (я не перешел по ссылке на сайт, на который вы ссылаетесь).

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