The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
pthread_detach, !*! maksim, 26-Дек-08, 16:12  [смотреть все]
Всем привет!!
Столкнулся с такой проблемой решение есть но ненравится оно мне чувствую что не надежно!

Проблема заключается что pthread_detach не успевает отделить коректно созданный поток
в результате чего данные передоваемые в поток искажаются (мусор приходит)
если поставить sleep(1) то все ок иначе лажа но мне совсем не нравится решение со слипом вот пример кода

//Сдесь происходит чтение файла по позиции
  while(1)
   {sleep(2);
    if((end_pos=lseek (fd, -1, SEEK_END)) != -1)
      {
       if(tmp_pos != end_pos)
         {
            if(pre_pos != 0){ pre_pos=pre_pos+1; }

            for(i = pre_pos; i <= end_pos; i++)
             {
              len=lseek (fd, i, SEEK_SET);
              read(fd,ch,1);

              setbuf(stdout, NULL);

              if(ch[0] != '\n')
                {c++;
                 string[c-1] = ch[0];
                 string[c] = '\0';
                }
              if(ch[0] == '\n')
                {
                 c = 0;
                       //printf("%s\n",string);
                      start_thread_jurnal(string)
                 bzero(string,MAS);
                }
             }


int start_thread_jurnal(char *string)
{
  pthread_t child;


  char str[strlen(string)+10];
  strcpy(str,string);

  if ( pthread_create(&child, NULL, Child, (void *)str) != 0 )
      {
        perror("Thread creation");
      }else{
        pthread_detach(child);
      }
  return 0;
}

Если поставить sleep(1)  pthread_detach то вроде все ок (медленно строки обрабатывает единствинный минус - замечен)

если нету слипа  то до вызова потока строка передается как надо но вызвав ее уже из потака на выходе лажа


  • pthread_detach, !*! vic, 16:59 , 26-Дек-08 (1)
    >Всем привет!!
    >Столкнулся с такой проблемой решение есть но ненравится оно мне чувствую что
    >не надежно!
    >
    >Проблема заключается что pthread_detach не успевает отделить коректно созданный поток

    ну так делайте detach прямо в pthread_create а не после. Параметры у функции pthread_create не для красоты придуманы.

    далее ужасный кусок кода :(
    1. какие-то странные не нужные слипы
    2. циклы с <=
    3. ++pre_pos; лучше чем pre_pos=pre_pos+1;
    4. читать побайтно зло

    5. вдумайтесь что будет с str[] в момент выхода из функции здесь и детач в pthread_create не спасет:
    >[оверквотинг удален]
    >
    >  if ( pthread_create(&child, NULL, Child, (void *)str) != 0 )
    >
    >      {
    >        perror("Thread creation");
    >      }else{
    >        pthread_detach(child);
    >      }
    >  return 0;
    > }

    6. остальное анализировать не охота, ужасно выглядит :(

    • pthread_detach, !*! vic, 17:01 , 26-Дек-08 (2)
      чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()
      • pthread_detach, !*! maksim, 17:16 , 26-Дек-08 (3)
        >чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()

        Да я понял спасибо .. разбираюсь ...

        • pthread_detach, !*! maksim, 17:19 , 26-Дек-08 (4)
          >>чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()
          >
          >Да я понял спасибо .. разбираюсь ...

          malloc надо заюзать иначе треды будут работать с одним участком памяти?

          • pthread_detach, !*! vic, 18:03 , 26-Дек-08 (5)
            >>>чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()
            >>
            >>Да я понял спасибо .. разбираюсь ...
            >
            >malloc надо заюзать иначе треды будут работать с одним участком памяти?

            хуже, порождаемый поток в вашем случае повинуясь великому рандому может успеть получить валидную строку, а может не успеть, может успеть с ней поработать, а может не успеть. При выходе из функции строка разрушается, причем что будет с участком памяти - неопределенно, тем более на стеке. Момент когда второй поток начнет работать неизвестно, до того как первый выйдет из функции или после этого, это при каждом запуске по своему, они же параллельны :)

            ессно необходимо выделять строку хотя бы через тот же malloc(), и не забывать ее потом корректно free().

            • pthread_detach, !*! maksim, 19:07 , 26-Дек-08 (6)
              >[оверквотинг удален]
              >хуже, порождаемый поток в вашем случае повинуясь великому рандому может успеть получить
              >валидную строку, а может не успеть, может успеть с ней поработать,
              >а может не успеть. При выходе из функции строка разрушается, причем
              >что будет с участком памяти - неопределенно, тем более на стеке.
              >Момент когда второй поток начнет работать неизвестно, до того как первый
              >выйдет из функции или после этого, это при каждом запуске по
              >своему, они же параллельны :)
              >
              >ессно необходимо выделять строку хотя бы через тот же malloc(), и не
              >забывать ее потом корректно free().

              Да при использовании malloc все (работатет) как надо(наверно)  спасибо!

              А что бы не было пролем с освобаждением памяти(когда один поток закончил а майн выделяет новый кусок) mutex спасет положение?

              • pthread_detach, !*! vic, 19:14 , 26-Дек-08 (7)
                >[оверквотинг удален]
                >>выйдет из функции или после этого, это при каждом запуске по
                >>своему, они же параллельны :)
                >>
                >>ессно необходимо выделять строку хотя бы через тот же malloc(), и не
                >>забывать ее потом корректно free().
                >
                >Да при использовании malloc все (работатет) как надо(наверно)  спасибо!
                >
                >А что бы не было пролем с освобаждением памяти(когда один поток закончил
                >а майн выделяет новый кусок) mutex спасет положение?

                смотря к чему применять мьютекс :)

                • pthread_detach, !*! maksim, 19:28 , 26-Дек-08 (8)
                  Вот так спасет ситуацию исключит совместный доступ к объекту?

                  void * child(void* arg)
                  {
                    pthread_mutex_lock(&m);
                    char string[strlen((char*)arg+10)];
                    strcpy(string,(char*)arg);
                    free((char*)arg);
                    pthread_mutex_unlock(&m);
                    return 0;
                  }

                  • pthread_detach, !*! maksim, 19:55 , 26-Дек-08 (9)
                    >[оверквотинг удален]
                    >
                    >void * child(void* arg)
                    > {
                    >  pthread_mutex_lock(&m);
                    >  char string[strlen((char*)arg+10)];
                    >  strcpy(string,(char*)arg);
                    >  free((char*)arg);
                    >  pthread_mutex_unlock(&m);
                    >  return 0;
                    > }

                    Или может быть вот такой вот самый правильный вариант ?
                      pthread_create(&threads[0], &attr, inc_count, (void *)&thread_ids[0]);
                      pthread_create(&threads[1], &attr, inc_count, (void *)&thread_ids[1]);
                      pthread_create(&threads[2], &attr, watch_count, (void *)&thread_ids[2]);

                    • pthread_detach, !*! maksim, 20:11 , 26-Дек-08 (10)
                      >[оверквотинг удален]
                      >>  strcpy(string,(char*)arg);
                      >>  free((char*)arg);
                      >>  pthread_mutex_unlock(&m);
                      >>  return 0;
                      >> }
                      >
                      >Или может быть вот такой вот самый правильный вариант ?
                      >  pthread_create(&threads[0], &attr, inc_count, (void *)&thread_ids[0]);
                      >  pthread_create(&threads[1], &attr, inc_count, (void *)&thread_ids[1]);
                      >  pthread_create(&threads[2], &attr, watch_count, (void *)&thread_ids[2]);

                      Огромное Вам спасибо наконец то вроде прояснилось мне ближе индексация буду юзать ее!




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

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