2013-11-09 5 views
0

Я только начал изучать Pthreads, может кто-нибудь объяснить мне, почему Example 1 опасен, а Example 2 безопасен? Что предлагает (int*)malloc(sizeof(int))?Доступ к общим данным на Pthreads

Пример 1

int *globalptr = NULL; 
// shared ptr 
void *foo1 (void *ptr1) 
{ 
    int i = 15; 
    globalptr = &i; // ??? dangerous! 
    ... 
} 

void *foo2 (void *ptr2) 
{ 
    if (globalptr) *globalptr = 17; 
    ... 
} 

Пример 2

int *globalptr= NULL; 
// shared ptr 
void *foo1 (void *ptr1) 
{ 
    int i = 15; 
    globalptr =(int*)malloc(sizeof(int)); 
    // safe, but possibly memory leak; 
    // OK if garbage collection ok 
} 

void *foo2 (void *ptr2) 
{ 
    if (globalptr) *globalptr = 17; 
... 
} 

ответ

0

Я не видеть, что это особенно актуально для нарезания резьбы в целом или Pthreads в частности. Это стандартная ошибка C.

Пример 1 присваивает адрес локальной переменной глобальному ptr. Локальная переменная выйдет за пределы области действия и (возможно) будет перезаписана другим значением позже при повторном использовании стека. В этот момент глобальный ptr указывает на мусор или, как минимум, что-то неправильное.

Пример 2 выделяет пространство на целителе (которое не исчезнет до тех пор, пока оно не будет освобождено) и назначит его глобальному указателю. Некоторая другая функция должна помнить, чтобы освободить пространство, которое выделяет foo2, и, если они этого не делают, это то, где утечка памяти. Как правило, люди пытаются получить то, что выделяет память, чтобы нести ответственность за ее освобождение, но на практике это не на 100%.

Общие Pthreads ошибки

int main() 
{ 
    dataStruct a; 

    for (i...n) 
     a.somevalue = getData(); 
     pthread_create(tid[i], NULL, threadfunc, (void *) &a); 
} 

Там нет никакой гарантии, когда поток будет планируется запустить или что он будет копировать данные, которые он был передан в свои локальные переменные. Таким образом, к тому времени, когда он использует данные ptr, он был передан, он может указывать на что-то ошибочное.

+0

Я только что увидел эти примеры в разделе pthread книги, прежде чем ввести механизм мьютекса. Очень четкое объяснение, спасибо. –

+0

@Avraam Mavridis Я предполагаю, что это распространенная ошибка потоковой передачи в том смысле, что здесь вы увидите десятки вопросов, спрашивающих, почему их данные потоков перепутаны ... часто, потому что они передают адрес переменной стека в потоке, в котором они находятся к новой теме, а не к куче. Следовательно, если данные будут перезаписаны в локальном стеке (или поток полностью исчезнет вместе со своим стеком), данные созданного потока ptr указывают на who-know-what. – Duck

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