C получил новый стандарт, так как этот вопрос был задан (и последний ответ).
C11 теперь поставляется с поддержкой многопоточности и обращается к многопоточному поведению потоков:
§7.21.2 Потоки
*7 Каждый поток имеет связанную блокировку, которая используется для предотвращения гонок данных , когда несколько потоков выполнения обращаются к потоку, и к ограничивает перемежение потоковых операций, выполняемых несколькими потоками. Только один поток может удерживать эту блокировку одновременно. Блокировка реентерабельна: один поток может удерживать блокировку несколько раз в данный момент времени.
*8 Все функции, которые читают, пишут, позиционируют или запрашивают позицию потока, блокируют поток перед доступом к нему. Они снимают блокировку, связанную с потоком, когда доступ завершен.
Таким образом, реализация с потоками C11 должна гарантировать, что использование printf
является потокобезопасным.
Гарантируется ли атомарность (как в случае без чередования 1 ), на первый взгляд, мне было не ясно, потому что стандартная спица ограничивает чередование, в отличие от , предотвращающее , которое было предписано для гонок данных.
Я склоняюсь к тому, чтобы это было гарантировано. Стандарт говорит о , ограничивающем чередование, поскольку некоторое чередование, которое не меняет результат, все же допускается; например, fwrite
некоторые байты, fseek
еще немного назад и fwrite
до исходного смещения, так что оба fwrite
смещены вплотную. Реализация свободна переупорядочить эти 2 fwrite
с и объединить их в одну запись.
1 : См. Зачеркнутый текст в ответе R .. для примера.