потокобезопасность класса, импортируемого из dll - PullRequest
1 голос
/ 07 сентября 2011

У меня есть dll, которая экспортирует интерфейс

class Qwe{
    virtual void a() = 0;
    virtual void b() = 0;
};

extern "C" Qwe* createQwe();

Я загружаю ее в свою программу и создаю несколько объектов Qwe.Вопрос в том, безопасен ли доступ к этим объектам из разных потоков?Должен ли я открыть новый экземпляр библиотеки для каждого объекта, или одного достаточно?

Статические члены-члены не используются, а функции библиотеки сами по себе не являются поточно-ориентированными.

Чтобы определить вопрослучше ... экспортируемый класс может выглядеть следующим образом

class QweImpl : public Qwe{
   public:
      virtual void a() {
          std::fill(data.begin(), data.end(), 1.0)};
   private:
      std::vector<double> data; };

безопасен ли здесь QweImpl :: a ()?В том смысле, что два разных объекта QweImpl могут одновременно вызывать свои функции a ()?

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

В Windows вы можете загрузить библиотеку только один раз.Дальнейшие попытки загрузить библиотеку только увеличивают счетчик ссылок.Поэтому «загрузка библиотеки для каждого объекта» не является началом.

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

1 голос
/ 07 сентября 2011

Если в классе есть члены, к которым можно обращаться через несколько потоков, вам придется использовать механизм синхронизации для управления доступом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...