c++11 线程支持库----线程

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值