Тот факт, что вы не видите никаких проблем на однопроцессорной машине, но видите проблемы на многопроцессорной машине, является артефактом относительно большой степени детализации переключения контекста потока на однопроцессорной машине. Поток будет выполняться в течение N промежутков времени (миллисекунд, наносекунд и т. Д.), Прежде чем планировщик потока переключит выполнение на другой поток. Многие инструкции процессора могут выполняться в типичном временном интервале потока. Вы можете думать об этом, как о довольно большом куске эксклюзивного процессорного времени «free play», в течение которого вы, вероятно, не столкнетесь с конфликтами ресурсов, потому что на процессоре больше ничего не выполняется.
Однако при работе на многопроцессорной машине инструкции ЦП в двух потоках выполняются точно в одно и то же время. Размер порции «свободной игры» близок к нулю.
Чтобы воспроизвести проблему конфликта ресурсов между двумя потоками, необходимо, чтобы поток 1 обращался к ресурсу, а поток 2 - к ресурсу одновременно или почти одновременно.
При переключении потоков с высокой степенью детализации, которое происходит на однопроцессорной машине, вероятность того, что переключение потока произойдет точно в нужном месте, невелика, поэтому при обычном использовании программы на машине с однопроцессорным доступом программа может никогда не сработать.
В многопроцессорной машине инструкции выполняются одновременно в двух потоках, поэтому шансы одновременного одновременного доступа потока 1 и потока 2 к одному и тому же ресурсу намного, намного выше - в тысячи раз больше, чем однопроцессорный сценарий.
Я видел, как это происходило много раз: приложение, которое годами работало нормально на однопроцессорных машинах, внезапно начинает сбой повсеместно при запуске на новой многопроцессорной машине. Причина заключается в скрытой ошибке многопоточности в исходном коде, которая просто никогда не соответствует правильному совпадению временного среза для воспроизведения на машинах uniproc.
При работе с многопоточным кодом абсолютно непросто тестировать код на многопроцессорном оборудовании. Если в вашем коде возникают проблемы с коллизиями потоков, они быстро появятся на многопроцессорной машине.
Как уже отмечали другие, не используйте SuspendThread (), если вы не являетесь отладчиком. Используйте мьютексы или другие объекты синхронизации для координации между потоками.