2009-10-11 6 views
2

Я с нетерпением жду интервью на C++ в ближайшие недели. (yay) Итак, я переучивал C++ и изучал. К сожалению, я понял, что никогда не реализовал потоки в C++, и я несколько обеспокоен викториной о параллелизме.Стандартная практика для реализации потоков на C++?

Насколько я могу судить, C++ использует pthreads в Linux и какое-то другое устройство в Windows. Это верно? Есть ли еще один отраслевой стандарт, больше возможностей OO для обработки потоков на C++, которые мне следует ожидать? И есть ли хорошие веб-ресурсы, которые вы можете указать мне на практику и изучение потоков на C++?

Спасибо!

+4

Тип ссылки: C++ 0x будет иметь библиотеку потоков. http://en.wikipedia.org/wiki/C%2B%2B0x#Threading_facilities –

ответ

5

В настоящее время C++ полностью не осознает, что существуют потоки. Различные ОС предоставляют библиотеки потоковой передачи, чтобы сделать их доступными. Следующая версия C++, так называемая C++ 0x, собирается создать стандартную библиотеку потоков. Если бы я сегодня начал многопоточное приложение, я бы пошел либо с повышающими потоками, либо с потоками, которые были частью любого пакета, который я мог бы использовать, например, QT или WxWidgets.

+3

Стоит отметить, что потоки boost, вероятно, являются основой для потоков C++ 0x, хотя я не проверял. – Steve314

+0

@ Steve314: Они, хотя, AFAIK, есть некоторые отличия. – sbi

9

Существует библиотека boost threads, которая, вероятно, наиболее близка к стандарту.

В общем случае потоки поставляются операционной системой, поэтому вы получаете то, что предоставляется ОС. Кроме того, люди, впервые сталкивающиеся с потоками, часто находятся в графическом интерфейсе, чтобы позволить фоновому вычислению не блокировать графический интерфейс, и поэтому люди склонны использовать функции потоков, предоставляемые конкретной инфраструктурой графического интерфейса (MFC/Qt и т. Д.).

+2

Re "... который, вероятно, самый близкий к стандарту": это на самом деле очень верно, поскольку он очень похож на тот, который собирается быть в новом стандарте C++. – sbi

1

В окнах единственный способ создания потоков - использовать win32 API. Каждая библиотека, которую вы можете создать, которая создает потоки в окнах, в конечном итоге использует win32 CreateThread()

QT Contains a nice C++ обертка вокруг нити, которая является кросс-платформой. Обычно хорошей практикой является класс MyThread, который содержит все подробные сведения о настройке потока, проверку кодов ошибок, получение кода выхода и т. П. Класс MyThread имел бы чистую виртуальную функцию, называемую run(), которая предназначена для того, чтобы фактически делать то, что вы хотите, чтобы поток выполнял. Предполагается, что пользователь класса MyThread наследует его и реализует run() таким образом, чтобы вы могли изолировать пользователя класса от деталей для фактического создания потока.

MyThead также должен иметь способ start(), который инициирует нить. Поток запускается в некоторой точке входа внутри класса (обычно это должен быть статический метод), а затем это приводит к вызову вызываемого пользователем метода run().

2

Ну, пока C++ 0x не попадет сюда, в C++ нет стандартного способа выполнения потоковой передачи. Вы можете использовать любые средства, предоставляемые вашей операционной системой. Так что да, если вы работаете в UNIX-подобной операционной системе, вы можете использовать pthreads. В Windows вы можете использовать Windows API.

Существуют сторонние инструментальные средства, которые пытаются обеспечить унифицированный и переносимый API потоковой передачи, например. увеличить потоки и QT.

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

1

Beyond Qt, wxWidgets, Boost и native, предоставляемые операционной системой потоки, вы можете просто использовать Google для библиотек потоков для C++. Они, вероятно, более портативны и легки (если все, что вы ищете, это потоки).Однако, если у вас есть потребность в дополнительных средствах, и вышеупомянутые библиотеки предоставляют их, то используйте их и используйте. Boost особенно хорош, у него есть и другие возможности, но, по общему признанию, это потоковая библиотека, как сказал Брайан Нил, в некоторых отношениях ограничен.

0

Я видел несколько «реальных» реализаций резьбы с использованием C++, и все они были реализованы чьим написание Thread класса обернуть лежащий в основе O/S API

Например, в Windows, есть a CreateThread API: ваш класс Thread передаст его значение this параметру void* lpParameter API CreateThread; и ваш LPTHREAD_START_ROUTINE, который вы реализуете как частный статический метод класса Thread, тогда необходимо наложить void* назад на Thread*' in order to get the Thread` instance.

1

Для вашего интервью ни повышение, ни qt не являются полезными. вы могли бы просто использовать их как высокоуровневые библиотеки и интерфейсы, и никто не спрашивал вас, как использовать boost или qt в таком интервью. Для понимания потоков и мьютексов и т. Д. См. Документ от http://code.google.com/p/effoaddon/downloads/list, названный EffoAddons.pdf.

Raw source 
http://effoaddon.googlecode.com/svn/trunk/devel/effo/codebase/addons/thrd/src/thrd/thrd.cpp, 
high level abstract interface 
http://effoaddon.googlecode.com/svn/trunk/devel/effo/codebase/addons/thrd/include/thrd_i.h, 
and code support wait and signal 
http://effoaddon.googlecode.com/svn/trunk/devel/effo/codebase/addons/queue/include/iqb_ops_i.h. 

Вы должны изучить что-то основное, а не только интерфейсы высокого уровня, хотя пишите C++.

+0

обратитесь к другой теме, я ответил, http://stackoverflow.com/questions/1527383/a-way-to-destroy-thread-class, fyi – Test

Смежные вопросы