URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1459
[ Назад ]

Исходное сообщение
"Threads"

Отправлено Vanka , 05-Мрт-03 17:24 
Проблема состоит в следующем:

Есть массив 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 которя уже запущена и т.д.. Предполагаю что это можно реализовать с помощью тредов, а как не знаю. Испоьзование семафоров, мьютексов и т.д. не желательно потому что я хочу что бы массив одновременно заполнялся и обрабатывался уже заполненный массив. Может кто нибудь подскажет как это можно реализовать.

Спасибо.


Содержание

Сообщения в этом обсуждении
"RE: Threads"
Отправлено Max V. Zinal , 08-Мрт-03 22:53 
Код странноватый, ну да Бог автору судья.
Если доступ к данным массива осуществляют два потока
(или более - главное, больше одного) и хотя бы один
из потоков производит изменение данных, настоятельно
рекомендуется разбить каждую из потоковых функций
на набор атомарных операций, а саму атомарность
обеспечить столь немилыми Вашему сердцу мьютексами
али иными синхронизационными объектами. Современные
компиляторы C и процессоры *практически никогда* не
обеспечивают атомарность "элементарных" с точки зрения
кодера операций, в том числе и целочисленной арифметики.
Сие сделано не из вредности, а для сохранения достаточного
пространства для всяческих оптимизаций.
Так, например, если один поток массив заполняет,
а другой "недозаполненный" массив читает, может
получиться так, что потоком-"читателем" будет
извлечён из массива элемент, которого по "человеческой"
логике работы программы там вообще никогда не должно
было появиться, но который возник там вследствие частично
выполненной операции.

"RE: Threads"
Отправлено Vanka , 11-Мрт-03 08:45 
.....
>Так, например, если один поток массив заполняет,
>а другой "недозаполненный" массив читает, может
>получиться так, что потоком-"читателем" будет
>извлечён из массива элемент, которого по "человеческой"
>логике работы программы там вообще никогда не должно
>было появиться, но который возник там вследствие частично
>выполненной операции.
....

  В данном примере такой ситуации получиться не может. Я имел ввиду что массив будет заполняться быстрее чем обрабатываться. А что бы работа программы не останавливалась на время обработки массива по моему надо как то с потоками извратиться.