2012-05-18 3 views
2

При создании нового 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 

Даже если стек растет назад (который я не уверен) значение указателя настолько различается, что только надеяться, что созданный поток использует другую виртуальную память адресное пространство. Но я думаю, что это не так.

+1

Почему вы не печатаете адрес выделенной памяти вместо адреса локальной переменной 'stack'? Я имею в виду: printf ("alloc =% p \ n", stack); –

+0

@Adriano Он тоже это делает. Вот как мы можем видеть, что локальная переменная НЕ находится в выделенной области. – nos

+0

@ nos Я что-то пропустил! : O malloc будет выделять кучу (например, адрес 100). «стек» выделяется в стеке основного (например, адрес 10). Если все работает, переменная «a» должна быть (более или менее) по адресу 100. Но если вы напечатаете адрес & stack, вы увидите 10, а не 100. –

ответ

3

Вы печатая неправильные вещи,

printf("alloc=%p\n",&stack); 

Печать адрес локальной переменной стека, а не выделенной памяти. Вы должны сделать

printf("alloc=%p\n",stack); 

Кроме того, необходимо проверить на наличие ошибок:

ОШИБКИ

pthread_attr_setstack() can fail with the following error: 

    EINVAL stacksize is less than PTHREAD_STACK_MIN (16384) bytes. On some 
      systems, this error may also occur if stackaddr or 
      stackaddr + stacksize is not suitably aligned. 

вы только установить стек 10kb, поэтому попробовать еще раз с больший стек, и проверьте возвращаемое значение pthread_attr_setstack.

Возможно, я попытался бы выровнять страницу стека.

+0

Возможно, вы захотите использовать что-то вроде 'posix_memalign', чтобы быть в безопасности. – Flexo

+1

Да, я знаю. был замечен до – ritter

+0

сейчас работает !!!!!! – ritter

Смежные вопросы