c++支持库
c++包含线程、互斥、条件变量和期货的内建支持。
线程
class thread:
类 thread
表示单个执行线程。线程允许多个函数并发执行。
紧接着关联的线程对象构造,线程开始执行(为任何 OS 调度延迟悬挂),始于作为构造函数参数提供的顶层函数。忽略顶层函数的返回值,而且若它以抛异常终止,则调用 std::terminate 。顶层函数可以通过 std::promise 或修改共享变量(这可能要求同步,见 std::mutex 与 std::atomic )交流其返回值或异常到调用方。
std::thread
对象亦可在不表示任何线程的状态(默认构造、被移动、 detach 或 join 后),而执行线程可以不关联到任何 thread
对象( detach 后)。
没有两个 std::thread
对象会表示同一执行线程; std::thread
不可复制构造 (CopyConstructible) 或可复制赋值(CopyAssignable) ,尽管它可移动构造 (MoveConstructible) 且可移动赋值 (MoveAssignable) 。
管理当前线程的函数:
std::this_thread::yield() //建议实现再次调度线程的执行
#include <iostream>
#include <chrono>
#include <thread>
// 建议其他线程运行一小段时间的“忙睡眠”
void little_sleep(std::chrono::microseconds us)
{
auto start = std::chrono::high_resolution_clock::now();
auto end = start + us;
do {
std::this_thread::yield();
} while (std::chrono::high_resolution_clock::now() < end);
}
int main()
{
auto start = std::chrono::high_resolution_clock::now();
little_sleep(std::chrono::microseconds(1230));
auto elapsed = std::chrono::high_resolution_clock::now() - start;
std::cout << "waited for "
<< std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count()
<< " microseconds\n";
}
std::thread::id get_id() noexcept; //返回当前线程ID
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
std::mutex g_display_mutex;
void foo()
{
std::thread::id this_id = std::this_thread::get_id();
g_display_mutex.lock();
std::cout << "thread " << this_id << " sleeping...\n";
g_display_mutex.unlock();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
std::thread t1(foo);
std::thread t2(foo);
t1.join();
t2.join();
}
//thread 11376 sleeping...
//thread 11936 sleeping...
template< class Rep, class Period >
void sleep_for( const std::chrono::duration<Rep, Period>& sleep_duration );
阻塞当前线程执行,至少经过指定的 sleep_duration
。
此函数可能阻塞长于 sleep_duration
,因为调度或资源争议延迟。
标准库建议用稳定时钟度量时长。若实现用系统时间代替,则等待时间亦可能对始终调节敏感。
参数
sleep_duration | 要睡眠的时长 |
返回值
(无)
异常
任何时钟、 time_point 或 duration 在执行间抛出的异常(标准库提供的时钟、时间点和时长决不抛出)。
#include <iostream>
#include <chrono>
#include <thread>
int main()
{
std::cout << "Hello waiter" << std::endl; // 有意冲入
auto start = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(2)); //等待2s
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> elapsed = end - start;
std::cout << "Waited " << elapsed.count() << " ms\n";
}
//可能输出
//Hello waiter
//Waited 2000.11 ms