Как создать поток в классе? - PullRequest
2 голосов
/ 21 апреля 2009

Есть ли шаблон, который можно использовать для создания тем, когда мы программируем в ОО язык?

Как разработать пакет потоков для языка OO?

Ответы [ 7 ]

3 голосов
/ 21 апреля 2009

Поддержка

C ++ 0x будет поддерживать потоки в стандартной библиотеке .

На данный момент каждая платформа имеет свой собственный способ реализации потоков ( Windows , POSIX ), но вы можете использовать что-то, например boost :: thread чтобы не беспокоиться о вещах, специфичных для платформы.

В Java существует класс Thread .

Методы

В общем, чтобы поместить класс в другой поток, вы создадите поток, передавая этот класс в поток. Затем поток вызовет функцию в этом классе. Вот некоторый псевдо-C ++ - код:

main()
{
    Object myObject;

    thread = CreateThread(threadFunction, myObject);

    thread.join(); // wait for thread
}

threadFunction(Object theObject)
{
    theObject.doSomething();
}

Все это упрощается благодаря использованию boost (или потоков C ++ 0x) в C ++, и класс Thread в Java обрабатывает это для вас.

Связанная информация

Большой проблемой в многопоточных приложениях является синхронизация потоков. Это включает в себя такие проблемы, как условия гонки и взаимоблокировки , чтобы назвать пару.

Методы / объект существуют для решения этих проблем, такие как mutex . Мьютекс может быть заблокирован одним потоком, и любые другие потоки, которые пытаются заблокировать мьютекс, будут заблокированы, пока исходный поток не освободит мьютекс.

A семафор - обобщенный мьютекс.

Есть и другие полезные понятия, изложенные в посте Эрика.

2 голосов
/ 21 апреля 2009

Каждый фреймворк имеет свой собственный способ работы с потоками. Я предлагаю вам посмотреть класс потока java в документации по java, а затем, возможно, взглянуть на стандартные заголовки C ++ для деталей потока.

1 голос
/ 21 апреля 2009

В C / C ++ потоки часто реализуются с использованием функций. («Начать новый поток и запустить эту функцию внутри, уничтожает поток, когда функция заканчивается.»)

Каркасы потоков часто позволяют передавать параметры в функцию. Один из способов сделать OO с потоками - передать указатель объекта («this») в качестве параметров функции, а затем вызвать определенный метод для объекта.

1 голос
/ 21 апреля 2009

У каждого языка программирования есть свои способы обработки потоков.

C ++ во многом зависит от Boost , так что вы можете проверить, что

Java

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

  • Тупики
  • Livelocks
  • Условия гонки
  • Голод

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

Существует также ряд "хорошо известных методов" для синхронизации потоков, таких как

  • События
  • Замки
  • Монитор
  • Mutex
  • Семафор
  • Barrier
  • ...

этот список можно продолжать и продолжать, но в основном помогают "объектам" или переменным, которые помогут вам решить 4 упомянутые проблемы

0 голосов
/ 21 апреля 2009

Основное отличие, когда речь заходит об ООП и многопоточном программировании, заключается в том, что вы хотите, чтобы ваш новый поток имел в качестве функции запуска (нестатический) метод объекта.

Теперь есть несколько моделей программирования для этого: реализация интерфейса «Runnable» является наиболее распространенной. Ваш класс реализует стандартный интерфейс «Runnable», который имеет метод запуска, который обычно является виртуальным методом, называемым «run». Вы помещаете свой стартовый код в этот виртуальный метод, и когда вам нужно создать поток, вы создаете объект потока (обычно называемый потоком) и передаете ему объект вашего класса, который реализует интерфейс «Runnable». Затем вы вызываете метод "start" этого объекта "Thread", и он позаботится о том, чтобы код запуска, который вы написали в своем классе, запустился в новом потоке. В этом примере «Runnable» и «Thread» предоставляются выбранной библиотекой потоков или стандартной библиотекой / структурой языка программирования по вашему выбору. Также обратите внимание, что названия этих двух классов могут различаться.

Существует большая разница между C ++ и Java, когда речь идет о многопоточном программировании: C ++ не поддерживает многопоточность, в отличие от Java, которая имеет встроенную поддержку для этого.

Таким образом, для C ++ вам потребуется использовать специализированную библиотеку потоков, такую ​​как Pthreads (http://en.wikipedia.org/wiki/POSIX_Threads) или более универсальные библиотеки, такие как Boost, ACE, POCO, в которых уже есть поддержка потоков. Наименее рекомендуемый способ - Вызовите напрямую службы многопоточности ОС.

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

0 голосов
/ 21 апреля 2009

В Java вы можете использовать класс Thread или интерфейс Executor, в который вы можете отправить работающий объект. Проверьте пакет java.util.concurrent . И след параллелизма Учебника Java. Удачи.

0 голосов
/ 21 апреля 2009

Если вы используете MFC, то MFC предоставляет некоторые вспомогательные API фреймворка для работы с многопоточностью. Взгляните на эту статью: Многопоточность с C ++ и MFC

...