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]); Огромное Вам спасибо наконец то вроде прояснилось мне ближе индексация буду юзать ее!
|