Потокобезопасная символьная строка в C - PullRequest
2 голосов
/ 24 августа 2009

В С:

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

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

Ответы [ 2 ]

7 голосов
/ 24 августа 2009

Да, это очень быстро испортится

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

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

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

Редактировать

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

2 голосов
/ 24 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...