C ++ 11, доступный с более поздними компиляторами, такими как Visual Studio 2013, включает в себя потоки как часть языка наряду с несколькими другими приятными частями, такими как лямбды.
Включаемый файл threads
предоставляет класс потока, который представляет собой набор шаблонов. Функциональность потока находится в пространстве имен std::
. Некоторые функции синхронизации потоков используют std::this_thread
в качестве пространства имен (см. Почему пространство имен std :: this_thread? для пояснения).
В следующем примере консольного приложения с использованием Visual Studio 2013 демонстрируются некоторые функции потоков C ++ 11, включая использование лямбда-выражения (см. Что такое лямбда-выражение в C ++ 11? ). Обратите внимание, что функции, используемые для спящего потока, такие как std::this_thread::sleep_for()
, используют длительность от std::chrono
.
// threading.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
int funThread(const char *pName, const int nTimes, std::mutex *myMutex)
{
// loop the specified number of times each time waiting a second.
// we are using this mutex, which is shared by the threads to
// synchronize and allow only one thread at a time to to output.
for (int i = 0; i < nTimes; i++) {
myMutex->lock();
std::cout << "thread " << pName << " i = " << i << std::endl;
// delay this thread that is running for a second.
// the this_thread construct allows us access to several different
// functions such as sleep_for() and yield(). we do the sleep
// before doing the unlock() to demo how the lock/unlock works.
std::this_thread::sleep_for(std::chrono::seconds(1));
myMutex->unlock();
std::this_thread::yield();
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// create a mutex which we are going to use to synchronize output
// between the two threads.
std::mutex myMutex;
// create and start two threads each with a different name and a
// different number of iterations. we provide the mutex we are using
// to synchronize the two threads.
std::thread myThread1(funThread, "one", 5, &myMutex);
std::thread myThread2(funThread, "two", 15, &myMutex);
// wait for our two threads to finish.
myThread1.join();
myThread2.join();
auto fun = [](int x) {for (int i = 0; i < x; i++) { std::cout << "lambda thread " << i << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } };
// create a thread from the lambda above requesting three iterations.
std::thread xThread(fun, 3);
xThread.join();
return 0;
}