как сделать так, чтобы потребительские потоки без блокировок обменивались безопасностью с QThreads

Я имею в виду этот хороший пример: http://blog.qt.digia.com/blog/2006/12/04/threading-without-the-headache/ является то, что он обменивается голыми указателями и не использует Qt :: QueuedConnection.

Изменить: вот фрагмент кода, который показывает вышеуказанная ссылка (в случае, если ссылка отключится перед этим сообщением)

// create the producer and consumer and plug them together
Producer producer;
Consumer consumer;
producer.connect(&consumer, SIGNAL(consumed()), SLOT(produce()));
consumer.connect(&producer, SIGNAL(produced(QByteArray *)), SLOT(consume(QByteArray *)));

// they both get their own thread
QThread producerThread;
producer.moveToThread(&producerThread);
QThread consumerThread;
consumer.moveToThread(&consumerThread);

// go!
producerThread.start();
consumerThread.start();

Если бы я использовал unique_ptr в производителе, освобождая его, когда я вызываю произведенный сигнал и напрямую помещаю голый указатель в другой уникальный указатель в подключенном слоте потребления, это было бы несколько безопаснее. Особенно после некоторого технического обслуживания программисту есть смысл;)

void calculate()
{
std::unique_ptr<std::vector<int>> pi(new std::vector<int>());
...
produced(pi.release());
//prodiced is a signal, the connected slot destroys the object
//a slot must be connected or the objects are leaked
//if multiple slots are connected the objects are double deleted

}

void consume(std::vector<int> *piIn)
{
std::unique_ptr<std::vector<int>> pi(piIn);
...
}

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

Если бы я использовал общий указатель для const, это решило бы все мои проблемы, но было бы медленнее, и, насколько я знаю, мне пришлось бы зарегистрировать его в системе мета-объектов, как описано здесь: http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum Это хорошая идея?

Есть ли лучший способ сделать это, о котором я не думаю?

0

Решение

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]