dj4400 Ответов: 1

Несколько потоков записи в один файл на языке Си


Привет,
У меня есть несколько потоков в приложении на языке Си, и я хочу, чтобы они записывались в один файл журнала без блокировки
их бег.
Мне, вероятно, нужно сделать рабочий поток, который получает сигнал от каждого потока, когда он хочет записать в файл, а затем записать данные, которые он получил от сигнального потока

Порядок написания очень важен

Как я могу этого достичь?

Спасибо!

диджей

Что я уже пробовал:

Используя события, но я не могу понять, как отправить данные записи

0x01AA

Использовать критический раздел

1 Ответов

Рейтинг:
5

Rick York

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

Это означало, что обычная последовательность событий для регистрации события состояла в том, чтобы получить мьютекс, Скопировать текст сообщения в первый доступный слот буфера и освободить мьютекс. Это тоже было довольно быстро. У нас были запущены десятки процессов, так что это было довольно тяжело. Процесс записи файла ждал, пока буфер почти не заполнится, а затем записывал буфер в файл и очищал его. Он также написал буфер в полночь, когда день перевернулся. Это потому, что мы держали один файл для всех событий одного дня.

The buffer of messages was around 1MB and writing it to the file was slow. The writer had to open the log file, seek to the end of it, write all the data, and then close the file, all while holding the mutex. That took a surprisingly long amount of time which held up the worker processes and threads. To speed things up, I had it copy the entire buffer to a locally allocated buffer and then write the data from there. This took a little longer BUT it meant the mutex was held (and workers blocked) for less than a millisecond, just for the duration of the memory copy. The sequence of events for writing the message buffer was then allocate memory for the copy, acquire the mutex, copy the buffer, reset the buffer's counters, release the mutex, open the file and seek to its end, write the data, close the file, release the allocated memory.

It is important to note my system used multiple processes so I used a mutex to control access to the buffer. I also wrote this for a multiple threaded environment and for it I used a critical section to control access because it is much more efficient than a mutex. This is because a mutex is a kernel-level object that can work between multiple processes. A critical section is not and can work only between multiple threads of a single process. Since your system is a single process, a critical section would be best. The logic and implementation is essentially the same for both designs except the file writer is in a separate thread instead of a separate process and a critical section is used instead of a mutex for access control. Also, the buffer can be in local heap memory instead of shared memory but that is optional.


Afzaal Ahmad Zeeshan

Звучит интересно, как вы это сформулировали! 5ед.

Было бы удивительно прочитать код, но я думаю, что у вас его не будет.

Rick York

Спасибо.