Соединение символов к закрепленным адресам на Linux

Требование, чтобы "someOperation is not reentrant" было нечетным. Что должно произойти, если попытка возвращения? Учитывая, что someOperation можно вызывать только из потока main, я вижу только два варианта ...

  1. Блокировать полностью мьютексом / барьером и т. Д., Как вы пытались.
  2. Блокировать на основе счетчика уровня рекурсии и вращать цикл событий, пока этот счетчик не уменьшится до нуля.

1) Полностью заблокирует цикл событий потока, не позволяя корректно функционировать текущему диалоговому окну сообщений.

2) Разрешит одновременное ведение всех диалогов сообщений, а не их сериализацию.

Вместо того, чтобы пытаться сделать someOperation не-реентерабельным, я думаю, вам нужно убедиться, что вы используете его так, чтобы не привести к реентерабельности.

Одним из вариантов может быть использование отдельного QObject экземпляра производного класса самостоятельно QThread. Рассмотрим следующее ...

class signal_serialiser: public QObject {
  Q_OBJECT;
signals:
  void signal1();
  void signal2();
  void signal3();
};

Если экземпляр signal_serialiser перемещается в свой собственный поток, он может действовать как очередь для буферизации и пересылки различных сигналов, если используются подходящие типы соединений. В вашем коде у вас есть ...

QObject::connect(w, SIGNAL(signal1()), a, SLOT(slot1()), Qt::QueuedConnection);
QObject::connect(w, SIGNAL(signal2()), a, SLOT(slot2()), Qt::QueuedConnection);
QObject::connect(w, SIGNAL(signal3()), a, SLOT(slot3()), Qt::QueuedConnection);

Измените это на ...

signal_serialiser signal_serialiser;
QObject::connect(w, SIGNAL(signal1()), &signal_serialiser, SIGNAL(signal1()));
QObject::connect(w, SIGNAL(signal2()), &signal_serialiser, SIGNAL(signal2()));
QObject::connect(w, SIGNAL(signal3()), &signal_serialiser, SIGNAL(signal3()));

/*
 * Note the use of Qt::BlockingQueuedConnection for the
 * signal_serialiser --> A connections.
 */
QObject::connect(&signal_serialiser, SIGNAL(signal1()), a, SLOT(slot1()), Qt::BlockingQueuedConnection);
QObject::connect(&signal_serialiser, SIGNAL(signal2()), a, SLOT(slot2()), Qt::BlockingQueuedConnection);
QObject::connect(&signal_serialiser, SIGNAL(signal3()), a, SLOT(slot3()), Qt::BlockingQueuedConnection);
QThread signal_serialiser_thread;
signal_serialiser.moveToThread(&signal_serialiser_thread);
signal_serialiser_thread.start();

Я только провел базовое тестирование, но, похоже, оно дает желаемое поведение.

9
задан Tomi Junnila 30 January 2009 в 14:14
поделиться

3 ответа

Предложение litb для использования --defsym symbol=address действительно работает, но является немного громоздким, когда у Вас есть несколько дюжин таких экземпляров для отображения. Однако --just-symbols=symbolfile делает просто прием. Это взяло меня некоторое время для обнаружения синтаксиса symbolfile, который является

symbolname1 = address;
symbolname2 = address;
...

Пробелы, кажется, требуются, как иначе ld отчеты file format not recognized; treating as linker script.

17
ответ дан 4 December 2019 в 07:48
поделиться

Попробуйте его

--defsym symbol=expression

Как с этим:

gcc -Wl,--defsym,foobar=0x76543210 file.c

И сделайте foobar в своем коде объявлением экстерна:

extern struct FooBar foobar;

Это выглядит многообещающим. Однако это - плохая идея сделать такую вещь (если Вы действительно не знаете то, что Вы делаете). Почему Вам нужен он?

10
ответ дан 4 December 2019 в 07:48
поделиться

Я дам Вам горячую подсказку... GNU LD может сделать это (принятие системы освобождает, не нужен адрес, который Вы хотите). Просто необходимо создать собственный сценарий компоновщика вместо того, чтобы использовать автоматически сгенерированный компилятора. Прочитайте страницу справочника для ld. Кроме того, создание сценария компоновщика для сложной части программного обеспечения не является никакой легкой задачей при вовлечении GLIBC также.

1
ответ дан 4 December 2019 в 07:48
поделиться
Другие вопросы по тегам:

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