Может кто-нибудь опубликовать простой пример запуска двух (объектно-ориентированных) потоков в C ++.
Я ищу фактические объекты потока C ++, на которые я могу расширить методы выполнения (или что-то подобное), в отличие от вызова библиотеки потоков в стиле C.
Я пропустил любые специфичные для ОС запросы в надежде, что тот, кто ответит, ответит с использованием кроссплатформенных библиотек. Я просто делаю это прямо сейчас.
Ответы:
Создайте функцию, которую вы хотите, чтобы поток выполнял, например:
Теперь создайте
thread
объект, который в конечном итоге вызовет функцию, описанную выше, следующим образом:(Вам необходимо
#include <thread>
получить доступ кstd::thread
классу)Аргументы конструктора - это функция, которую будет выполнять поток, за которой следуют параметры функции. Поток автоматически запускается при строительстве.
Если позже вы захотите дождаться завершения потока, выполняющего функцию, вызовите:
(Присоединение означает, что поток, вызвавший новый поток, будет ожидать завершения нового потока, прежде чем он продолжит свое собственное выполнение).
Код
Больше информации о std :: thread здесь
-std=c++0x -pthread
.источник
-std=c++0x
(вместо-std=c++0x
)» Я считаю, что второй «c ++ 0x» должен быть вместо «c ++ 11», но это невозможно изменить, потому что редактирование слишком мало.task1
. Таким образом, указатель на функцию также обозначается какtask1
. Но спасибо за то, что вы подняли этот вопрос, потому что я считаю, что я был неправ, и это эквивалентно&task1
, поэтому не имеет значения, какую форму вы решите написать (если так, я думаю, что указатель на указатель на функцию&&task1
- это было бы плохо ). Актуальный вопрос .Ну, технически любой такой объект будет построен из библиотеки потоков в стиле C, потому что C ++ только что определил стандартную
std::thread
модель в c ++ 0x, которая была просто завершена и еще не реализована. Проблема в некоторой степени системная, технически существующая модель памяти c ++ недостаточно строгая, чтобы обеспечить четкую семантику для всех случаев «происходит раньше». Некоторое время назад Ханс Бём написал статью на эту тему и сыграл важную роль в разработке стандарта c ++ 0x по этой теме.http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
Тем не менее, есть несколько кроссплатформенных библиотек C ++, которые на практике работают просто отлично. Строительные блоки Intel содержат объект tbb :: thread, который близко соответствует стандарту c ++ 0x, а Boost имеет библиотеку boost :: thread, которая делает то же самое.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
Используя boost :: thread, вы получите что-то вроде:
источник
Существует также библиотека POSIX для операционных систем POSIX. Проверить совместимость
компилировать с -lpthread
http://en.wikipedia.org/wiki/POSIX_Threads
источник
источник
При поиске примера класса C ++, который вызывает один из своих собственных методов экземпляра в новом потоке, возникает этот вопрос, но мы не смогли использовать ни один из этих ответов таким образом. Вот пример, который делает это:
Class.h
Class.cpp
Обратите внимание, что этот пример не попадает в мьютекс или блокировку.
источник
Если не требуется отдельная функция в глобальных пространствах имен, мы можем использовать лямбда-функции для создания потоков.
Одним из основных преимуществ создания потока с использованием лямбды является то, что нам не нужно передавать локальные параметры в виде списка аргументов. Мы можем использовать список захвата для того же самого, и свойство закрытия lambda позаботится о жизненном цикле.
Вот пример кода
До сих пор я обнаружил, что лямбда-символы C ++ являются лучшим способом создания потоков, особенно для более простых функций потоков.
источник
Это во многом зависит от библиотеки, которую вы решили использовать. Например, если вы используете библиотеку wxWidgets, создание потока будет выглядеть так:
Если ваш основной поток вызывает метод CreateThread, вы создадите новый поток, который начнет выполнять код в вашем методе «Entry». В большинстве случаев вам нужно будет сохранить ссылку на поток, чтобы присоединиться к нему или остановить его. Более подробная информация здесь: wxThread документация
источник