Споделен ресурс ==Раздора
Записването в нормален файл по дефиниция е сериализирана операция. Не печелите производителност, като се опитвате да пишете в него от множество нишки, I/O е ограничен ограничен ресурс с порядък по-малка честотна лента дори от най-бавния или най-претоварения процесор.
Едновременният достъп до споделен ресурс може да бъде сложен (и бавен)
Ако имате множество нишки, които извършват скъпи изчисления, тогава имате опции, ако просто използвате няколко нишки, защото смятате, че ще ускорите нещо, просто ще направите обратното. Съпротивата за I/O винаги забавя достъпа до ресурса, никога не го ускорява поради изчакване на заключване и други допълнителни разходи.
Трябва да имате критична секция, която е защитена и позволява само един запис в даден момент. Просто потърсете изходния код за всеки записващ запис, който поддържа едновременност и ще видите, че има само една нишка, която записва във файла.
Ако приложението ви е основно:
-
CPU ограничен: Можете да използвате някакъв заключващ механизъм/конструкция за данни, за да позволите само една нишка от много да записва във файла наведнъж, което ще бъде безполезно от гледна точка на едновременност като наивно решение; Ако тези нишки са свързани с процесора с малко I/O, това може да работи.
-
I/O Bound: Това е най-често срещаният случай, трябва да използвате система за предаване на съобщения с някаква опашка и всички нишки да се публикуват в опашка/буфер и да издърпате една нишка от нея и да запишете във файла. Това ще бъде най-мащабируемото и най-лесното за изпълнение решение.
Журнализиране – асинхронни записи
Ако трябва да създадете един супер голям файл, при който редът на запис е маловажен и програмата е свързана с процесора, можете да използвате техника за водене на журнал.
Имайте всеки process
запишете в отделен файл и след това свържете множеството файлове в един голям файл в края. Това е много стара школа нискотехнологична решение, което работи добре и работи от десетилетия.
Очевидно, колкото повече вход/изход за съхранение имате, толкова по-добре ще се представи това в крайния конкат.