Почему крючки malloc небезопасны с pthreads?

Сообщение об ошибке довольно ясно: вы пытаетесь нарисовать QWidget (который в PyQt4.5 наследует QPaintDevice и QObject), прежде чем вы создадите экземпляр QApplication. Но ваш код слишком велик для чтения по строкам. Попытайтесь изолировать ошибку, создавая небольшое приложение и добавляя функциональность шаг за шагом. Или используйте отладчик (предполагается, что IDE, такие как Eclipse + PyDev, могут отлаживать ваше приложение). Или предоставим нам небольшой, самодостаточный пример проблемы.

1
задан Jonathan Leffler 16 January 2019 в 23:46
поделиться

2 ответа

__malloc_hook вызывается сразу после ввода __libc_malloc в здесь :

void *
__libc_malloc (size_t bytes)
{
  mstate ar_ptr;
  void *victim;

  void *(*hook) (size_t, const void *)
    = atomic_forced_read (__malloc_hook);
  if (__builtin_expect (hook != NULL, 0))
    return (*hook)(bytes, RETURN_ADDRESS (0));

, в то время как блокировка потока реализована в __libc_malloc 20 строками ниже, в здесь :

  if (SINGLE_THREAD_P)
    {
      victim = _int_malloc (&main_arena, bytes);
      assert (!victim || chunk_is_mmapped (mem2chunk (victim)) ||
          &main_arena == arena_for_chunk (mem2chunk (victim)));
      return victim;
    }

  arena_get (ar_ptr, bytes);

arena_get строит арену для нитки или выбирает арену и блокирует арену, объявленную здесь .

Таким образом, при разработке собственного __malloc_hook разработчик несет ответственность за все, включая блокировку потоков (при необходимости).

0
ответ дан Kamil Cuk 16 January 2019 в 23:46
поделиться

Вы не должны использовать их в любом случае; они устарели. См. Раздел «Примечания» любой недавней копии the malloc_hook(3) man page :

Использование этих функций ловушек небезопасно в многопоточных программах, и теперь они устарели. Программисты должны вместо этого опередить вызовы соответствующих функций, определив и экспортировав такие функции, как «malloc» и «free».

0
ответ дан nemequ 16 January 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: