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

Исходное сообщение
"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 , 26-Дек-08 16:59 
>Всем привет!!
>Столкнулся с такой проблемой решение есть но ненравится оно мне чувствую что
>не надежно!
>
>Проблема заключается что 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 , 26-Дек-08 17:01 
чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()

"pthread_detach"
Отправлено maksim , 26-Дек-08 17:16 
>чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()

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


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

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


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

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

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


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

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

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


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

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


"pthread_detach"
Отправлено maksim , 26-Дек-08 19:28 
Вот так спасет ситуацию исключит совместный доступ к объекту?

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 , 26-Дек-08 19:55 
>[оверквотинг удален]
>
>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 , 26-Дек-08 20:11 
>[оверквотинг удален]
>>  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]);

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