При создании нового pthread
и передачи ему аргумента, измененного с помощью pthread_attr_getstack
, кажется, что он не использует определенное пространство стека.Почему pthread не использует заданное пространство стека?
void* thread_function(void * ptr)
{
int a;
printf("stack var in thread %p\n",&a);
}
int main(int argc , char **argv)
{
pthread_t thread;
void * ptr = NULL;
const int stack_size = 10*1024;
void * stack = malloc(stack_size);
printf("alloc=%p\n",&stack);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstack(&attr , stack , stack_size);
if (pthread_create(&thread, &attr, &thread_function , ptr)) {
printf("failed to create thread\n");
return 1;
}
pthread_attr_destroy(&attr);
pthread_exit(0);
return 0;
}
К сожалению, выход:
alloc=0x7fff48989bc8
stack var in thread 0x7f6e6f0d2ebc
Даже если стек растет назад (который я не уверен) значение указателя настолько различается, что только надеяться, что созданный поток использует другую виртуальную память адресное пространство. Но я думаю, что это не так.
Почему вы не печатаете адрес выделенной памяти вместо адреса локальной переменной 'stack'? Я имею в виду: printf ("alloc =% p \ n", stack); –
@Adriano Он тоже это делает. Вот как мы можем видеть, что локальная переменная НЕ находится в выделенной области. – nos
@ nos Я что-то пропустил! : O malloc будет выделять кучу (например, адрес 100). «стек» выделяется в стеке основного (например, адрес 10). Если все работает, переменная «a» должна быть (более или менее) по адресу 100. Но если вы напечатаете адрес & stack, вы увидите 10, а не 100. –