Всем привет!!
Столкнулся с такой проблемой решение есть но ненравится оно мне чувствую что не надежно!Проблема заключается что 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 не успевает отделить коректно созданный потокну так делайте 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. остальное анализировать не охота, ужасно выглядит :(
чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()
>чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()Да я понял спасибо .. разбираюсь ...
>>чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()
>
>Да я понял спасибо .. разбираюсь ...malloc надо заюзать иначе треды будут работать с одним участком памяти?
>>>чертов оверквотинг, по 5 пункту смотрите на содержимое свой функции start_thread_jurnal()
>>
>>Да я понял спасибо .. разбираюсь ...
>
>malloc надо заюзать иначе треды будут работать с одним участком памяти?хуже, порождаемый поток в вашем случае повинуясь великому рандому может успеть получить валидную строку, а может не успеть, может успеть с ней поработать, а может не успеть. При выходе из функции строка разрушается, причем что будет с участком памяти - неопределенно, тем более на стеке. Момент когда второй поток начнет работать неизвестно, до того как первый выйдет из функции или после этого, это при каждом запуске по своему, они же параллельны :)
ессно необходимо выделять строку хотя бы через тот же malloc(), и не забывать ее потом корректно free().
>[оверквотинг удален]
>хуже, порождаемый поток в вашем случае повинуясь великому рандому может успеть получить
>валидную строку, а может не успеть, может успеть с ней поработать,
>а может не успеть. При выходе из функции строка разрушается, причем
>что будет с участком памяти - неопределенно, тем более на стеке.
>Момент когда второй поток начнет работать неизвестно, до того как первый
>выйдет из функции или после этого, это при каждом запуске по
>своему, они же параллельны :)
>
>ессно необходимо выделять строку хотя бы через тот же malloc(), и не
>забывать ее потом корректно free().Да при использовании malloc все (работатет) как надо(наверно) спасибо!
А что бы не было пролем с освобаждением памяти(когда один поток закончил а майн выделяет новый кусок) mutex спасет положение?
>[оверквотинг удален]
>>выйдет из функции или после этого, это при каждом запуске по
>>своему, они же параллельны :)
>>
>>ессно необходимо выделять строку хотя бы через тот же malloc(), и не
>>забывать ее потом корректно free().
>
>Да при использовании malloc все (работатет) как надо(наверно) спасибо!
>
>А что бы не было пролем с освобаждением памяти(когда один поток закончил
>а майн выделяет новый кусок) mutex спасет положение?смотря к чему применять мьютекс :)
Вот так спасет ситуацию исключит совместный доступ к объекту?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;
}
>[оверквотинг удален]
>
>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]);
>[оверквотинг удален]
>> 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]);Огромное Вам спасибо наконец то вроде прояснилось мне ближе индексация буду юзать ее!