The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Threads"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Threads"
Сообщение от Vanka Искать по авторуВ закладки on 05-Мрт-03, 17:24  (MSK)
Проблема состоит в следующем:

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

Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру