Я только начал изучать 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;
...
}
Я только что увидел эти примеры в разделе pthread книги, прежде чем ввести механизм мьютекса. Очень четкое объяснение, спасибо. –
@Avraam Mavridis Я предполагаю, что это распространенная ошибка потоковой передачи в том смысле, что здесь вы увидите десятки вопросов, спрашивающих, почему их данные потоков перепутаны ... часто, потому что они передают адрес переменной стека в потоке, в котором они находятся к новой теме, а не к куче. Следовательно, если данные будут перезаписаны в локальном стеке (или поток полностью исчезнет вместе со своим стеком), данные созданного потока ptr указывают на who-know-what. – Duck