Каков наилучший способ создания потока в C ++ при передаче класса и индекса? - PullRequest
3 голосов
/ 02 февраля 2010

Я создаю программу, параллельную данным, используя pthreads и C ++. Из функции pthread из класса я узнал, как снабдить pthread_create указателем на функцию статической функции C ++ (и передать ей аргумент this).

Однако мне также необходимо снабдить поток индексом, чтобы он знал, над какими данными он работает. Я мог бы malloc структуру для каждого потока (с указателем на класс C ++ и индекс), но это, похоже, добавило бы некоторый бухгалтерский код и могло привести к утечкам, если структура не освобождена. Есть ли лучший способ сделать это?

Ответы [ 4 ]

7 голосов
/ 02 февраля 2010

Вы можете использовать Boost.Thread .Он обеспечивает безопасный для типов способ передачи более чем одного аргумента в ваш вызываемый объект.

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

4 голосов
/ 02 февраля 2010

Если вы не передаете тот же объект C ++, что и указатель this, нескольким параллельным потокам, просто добавьте индекс к объекту.

Я бы порекомендовал иметь один объект на поток, чтобы облегчить отладку, если ничего больше. Сделайте ваш текущий this класс ресурсом, разделенным по ссылке между объектами потока.

Если это означает добавление новых объектов в кучу, просто delete их сразу после вызова pthread_join. На самом деле не так много места для ошибок.

4 голосов
/ 02 февраля 2010

Есть ли лучший способ сделать это?

Не совсем. Поскольку функции потока могут принимать только один аргумент void *, любые данные, которые вы хотите передать в функцию потока, должны быть частью структуры или класса, который содержит необходимые вам данные. Обычный шаблон проектирования должен иметь класс или структуру ThreadParameters, которые содержат все, что вам нужно, и которые вы можете добавить, если вам нужно иметь больше параметров.

Самый простой способ обработать освобождение - это иметь человека, который создает , поток выделяет ThreadParameters, и сам поток освобождает ThreadParameters непосредственно перед его выходом.

1 голос
/ 02 февраля 2010

Если с каждым потоком связан объект (экземпляр класса).(Я понял это из вашей ссылки на this.) Вы можете просто сделать индекс членом класса.Это можно настроить в конструкторе или использовать альтернативно с помощью установщика.

class C { 
  Index index_; 
public:
  C(Index &index) : index_(idx) {}
  void Run() { ... }
}

Index workSet;
C worker(workSet);
worker.Run();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...