2009-08-24 4 views
2

В C:Потокобезопасная символ строка в C

Если у меня есть 3 темы, 2 темы, которые добавляющая строка в глобальную строку полукокса (символ *), и 1 поток, который считывает данные из этого символьной строки ,

Предположим, что 2 потока добавили около 8 000 строк в секунду, а третий поток читает довольно часто. Есть ли вероятность, что они будут добавляться точно в одно и то же время и перезаписывать данные друг друга или читать в одно и то же время и получать неполную строку?

ответ

7

Да, это будет испорчено довольно быстро

Вы должны защитить доступ к этой строке с помощью мьютекса или чтения/записи механизма блокировки.

Я не уверен, на какой платформе вы находитесь, но посмотрите на библиотеку pthreads, если вы находитесь на платформе * nix.

Я не разработаем для окон, поэтому я не могу указать вам на любые возможности распараллеливания (хотя я знаю, что есть много хороших заправочной API в Win32

Edit

@OP у вас рассмотрели проблемы с памятью добавления 8000 строк (вы не указали, насколько велика каждая строка) в секунду. У вас скоро будет нехватка памяти, если вы никогда не удаляете данные из своей глобальной строки. подумайте об ограничении размера этой строки каким-то образом, а также настройте какую-то систему для удаления данных из вашей строки (нить читателя будет лучшим местом для этого). уже сделав это, тогда проигнорируйте вышеизложенное.

+0

Как отмечает Том, «вполне вероятно, что это будет«, скорее всего, занижение », это будет ** **, особенно на многоядерной машине. –

+0

@ Джонатан. Ты прав. Я обновил свой ответ, спасибо, указав, что вне – Glen

+0

Привет, спасибо за ваши ответы, размер строки может быть около 100 символов, и я очищаю строку после каждого чтения. Я просто провел несколько тестов, и, как сказал Том, он перезаписывает еще один файл :( Я нахожусь в Linux. – 2009-08-24 14:50:50

2

Есть ли вероятность того, что они добавит точно на то же самое время и перезаписывать друг друга данные или читать на то же самое время и получить неполную строку?

При работе с параллельными проблемами вы всегда должны защищать свои данные. Вы никогда не сможете оставлять подобные вещи на произвол судьбы. Даже если есть вероятность нанести 0.1%, это будет.

+0

+1 для «это ** будет ** произойдет». –

Смежные вопросы