The OpenNET Project / Index page

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

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

"pthread_detach"  
Сообщение от maksim (??) on 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 то вроде все ок (медленно строки обрабатывает единствинный минус - замечен)

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


Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

  • pthread_detach, vic, 16:59 , 26-Дек-08, (1)  
    • pthread_detach, vic, 17:01 , 26-Дек-08, (2)  
      • pthread_detach, maksim, 17:16 , 26-Дек-08, (3)  
        • pthread_detach, maksim, 17:19 , 26-Дек-08, (4)  
          • pthread_detach, vic, 18:03 , 26-Дек-08, (5)  
            • pthread_detach, maksim, 19:07 , 26-Дек-08, (6)  
              • pthread_detach, vic, 19:14 , 26-Дек-08, (7)  
                • pthread_detach, maksim, 19:28 , 26-Дек-08, (8)  
                  • pthread_detach, maksim, 19:55 , 26-Дек-08, (9)  
                    • pthread_detach, maksim, 20:11 , 26-Дек-08, (10)  

Сообщения по теме [Сортировка по времени | RSS]


1. "pthread_detach"  
Сообщение от vic (??) on 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. остальное анализировать не охота, ужасно выглядит :(

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "pthread_detach"  
Сообщение от vic (??) on 26-Дек-08, 17:01 
чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "pthread_detach"  
Сообщение от maksim (??) on 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;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "pthread_detach"  
Сообщение от maksim (??) on 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]);

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "pthread_detach"  
Сообщение от maksim (??) on 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]);

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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