Указатели структуры в c не возвращают правильное значение
У меня есть эта программа:
#include <stdio.h>
#niclude ......
struct sort {
char * array;
int left,right;
};
void quicksortthread(struct sort *s){
int left, right;
int i, j, x, tmp;
pthread_t *th1, *th2;
char * v;
struct sort s1;
struct sort s2;
left = s->left;
right = s->right;
v = s->array;
printf("\n\n\n\n QT: l=%i, r=%i \n",left,right);
//sorting algorithm
if (left >= right)
return;
x = v[left];
i = left - 1;
j = right + 1;
while (i < j) {
while (v[--j] > x);
while (v[++i] < x);
if (i < j) {
char temp = v[i];
v[i] = v[j];
v[j] = temp;
}
}
s1.array = v;
s1.left = left;
s1.right = j;
s2.array = v;
s2.left = j+1;
s2.right = right;
printf("1)left = %i; right= %i\n", left,j);
printf("2)left = %i; right= %i\n", j+1,right);
pthread_create(&th1, NULL, quicksortthread,&s1);
pthread_create(&th2, NULL, quicksortthread,&s2);
}
int main (int argc, char ** argv){
pthread_t *th1;
int fd, len, pg, i, j;
int left, right;
struct stat stat_buf;
char c, *paddr;
struct sort s;
/*..LOTS OF THIGS
Define right and left as integers and
paddr as a char *
..*/
if( (right) >= (atoi(argv[2])) ){
//printf("filling structure\n");
s.array = paddr;
s.left = left;
s.right = right;
//printf("creating threads\n");
pthread_create(&th1, NULL, quicksortthread,&s);
}
sleep(100);
}
После двух вызовов потока он перестает работать. Это потому, что структура передана в функцию pthread_create
в качестве последнего параметра кажется неправильным. Он компилируется и выполняется без (например) ошибки сегментации. Я уверен, что я правильно использую структуры и указатели.
Затем программа возвращается таким образом:
left = 0; right= 2048
QT: l=0, r=2048
1)left = 0; right= 0
2)left = 1; right= 2048
left = 0; right= 0
QT: l=0, r=0
left = 1037061890; right= 32542
QT: l=1037061890, r=32542
РЕШЕНО: Хорошо, я решил эту проблему, изменив подпрограмму потока следующим образом:
nt left, right;
int i, j, x, tmp;
pthread_t th1, th2;
char * v;
struct sort * s1;
s1= malloc(sizeof(struct sort *));
struct sort * s2;
s2= malloc(sizeof(struct sort *));
left = s->left;
right = s->right;
printf("\n\n\n\nleft = %i; right= %i\n", left,right);
v = s->array;
printf("QT: l=%i, r=%i \n",left,right);
if (left >= right)
return;
x = v[left];
i = left - 1;
j = right + 1;
while (i < j) {
while (v[--j] > x);
while (v[++i] < x);
if (i < j) {
char temp = v[i];
v[i] = v[j];
v[j] = temp;
}
}
s1->array = v;
s1->left = left;
s1->right = j;
s2->array = v;
s2->left = j+1;
s2->right = right;
printf("1)left = %i; right= %i\n", left,j);
printf("2)left = %i; right= %i\n", j+1,right);
pthread_create(&th1, NULL, quicksortthread,s1);
pthread_create(&th2, NULL, quicksortthread,s2);
1 ответ
struct sort s
является автоматической переменной, и вы передаете ее указатель на поток. Это не очень хорошая практика. У потока будет свое существование даже после функции, которая вызвала pthread_create
в этом случае возвращается переменная стека вне области видимости. Та же проблема существует для того, как вы создаете темы из quicksortthread
сама функция, в которой struct sort s1
а также struct sort s2
являются локальными переменными для функции быстрой сортировки. Лучше распределять память под эти структуры динамически.
Также не понятно, почему вы добавили sleep(100)
в твоем главном. Вы должны использовать pthread_join
дождаться завершения созданного потока перед выходом из основного.
pthread_create
ожидает только pthread_t *
в качестве первого аргумента, но вы передаете pthread**
, pthread_t *th1
должно быть pthread_t th1
,