Проблема состоит в следующем:Есть массив char *а;
Есть функция zapol_arr которя заполняет массив а
zapol_arr()
{
a = (char *)malloc(100);
int i = 0;
while(1)
{
a[i] = что то туда пихаем;
i++;
if (i == 101)
{
Здесь требуется копию а передать функции obrab_arr на обработку
i = 0;
free(a);
}
}
}
void obrab_arr(char *str)
{
Делаем что то с str
}obrab_arr - в любом случе завершает свою работу.
Вопрос в следующем: счетчик может стать равным 101 когда обработка массива еще не закончена, следовательно нужно запустить obrab_arr паралельно с той obrab_arr которя уже запущена и т.д.. Предполагаю что это можно реализовать с помощью тредов, а как не знаю. Испоьзование семафоров, мьютексов и т.д. не желательно потому что я хочу что бы массив одновременно заполнялся и обрабатывался уже заполненный массив. Может кто нибудь подскажет как это можно реализовать.
Спасибо.
Код странноватый, ну да Бог автору судья.
Если доступ к данным массива осуществляют два потока
(или более - главное, больше одного) и хотя бы один
из потоков производит изменение данных, настоятельно
рекомендуется разбить каждую из потоковых функций
на набор атомарных операций, а саму атомарность
обеспечить столь немилыми Вашему сердцу мьютексами
али иными синхронизационными объектами. Современные
компиляторы C и процессоры *практически никогда* не
обеспечивают атомарность "элементарных" с точки зрения
кодера операций, в том числе и целочисленной арифметики.
Сие сделано не из вредности, а для сохранения достаточного
пространства для всяческих оптимизаций.
Так, например, если один поток массив заполняет,
а другой "недозаполненный" массив читает, может
получиться так, что потоком-"читателем" будет
извлечён из массива элемент, которого по "человеческой"
логике работы программы там вообще никогда не должно
было появиться, но который возник там вследствие частично
выполненной операции.
.....
>Так, например, если один поток массив заполняет,
>а другой "недозаполненный" массив читает, может
>получиться так, что потоком-"читателем" будет
>извлечён из массива элемент, которого по "человеческой"
>логике работы программы там вообще никогда не должно
>было появиться, но который возник там вследствие частично
>выполненной операции.
....В данном примере такой ситуации получиться не может. Я имел ввиду что массив будет заполняться быстрее чем обрабатываться. А что бы работа программы не останавливалась на время обработки массива по моему надо как то с потоками извратиться.