码迷,mamicode.com
首页 > 编程语言 > 详细

c++多线程基础2(命名空间 this_thread)

时间:2018-03-10 16:10:39      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:blog   start   cout   stream   ttl   res   count()   函数   duration   

std::this_thread::yield:

定义于头文件 <thread>

函数原型void yield(noexcept;

此函数的准确性为依赖于实现,特别是使用中的 OS 调度器机制和系统状态。例如,先进先出实时调度器( Linux 的 SCHED_FIFO )将悬挂当前线程并将它放到准备运行的同优先级线程的队列尾(而若无其他线程在同优先级,则 yield 无效果)

代码:

技术分享图片
 1 #include <iostream>
 2 #include <thread>
 3 #include <chrono>
 4 using namespace std;
 5 
 6 void little_sleep(std::chrono::milliseconds us) {
 7     auto start = std::chrono::high_resolution_clock::now();
 8     auto end = start + us;
 9     do { 
10         std::this_thread::yield();//让出当前时间片
11     }while(std::chrono::high_resolution_clock::now() < end);
12 }
13 
14 int main(void) {
15     auto start = std::chrono::high_resolution_clock::now();//获取当前时间
16 
17     little_sleep(std::chrono::milliseconds(100));
18 
19     auto elapsed = std::chrono::high_resolution_clock::now() - start;//计算执行 little_sleep 所用时间
20 
21     cout << "waited fo "
22             << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() //将 elapsed 时间周期转化为 milliseconds 并输出
23             << " milliseconds\n";
24 
25 // 输出:
26 // waited fo 100 milliseconds
27 
28     return 0;
29 }
View Code

 

std::this_thread::get_id:

定义于头文件 <thread>

函数原型std::thread::id get_id(noexcept;

得到当前线程的 id

代码:

技术分享图片
 1 #include <iostream>
 2 #include <thread>
 3 #include <chrono>
 4 #include <mutex>
 5 using namespace std;
 6 
 7 std::mutex g_display_mutex;
 8 
 9 void foo() {
10     auto this_id = std::this_thread::get_id();
11 
12     g_display_mutex.lock();
13     cout << "thread" << this_id << " sleeping..." << endl;
14     g_display_mutex.unlock();
15 
16     std::this_thread::sleep_for(std::chrono::seconds(1));
17 }
18 
19 int main(void) {
20     std::thread t1(foo);
21     std::thread t2(foo);
22 
23     t1.join();
24     t2.join();
25 
26 // 输出:
27 // thread2 sleeping...
28 // thread3 sleeping...
29 
30     return 0;
31 }
View Code

 

std::this_thread::sleep_for:

定义于头文件 <thread>

函数原型

templateclass Rep, class Period >
void sleep_forconst std::chrono::duration<Rep, Period>& sleep_duration );

 

阻塞当前线程执行,以至少为指定的 sleep_duration 。

此函数可能阻塞长于 sleep_duration ,因为调度或资源争议延迟。

标准库建议用稳定时钟度量时长。若实现用系统时间代替,则等待时间亦可能对始终调节敏感

 

异常:任何时钟、 time_point 或 duration 在执行间抛出的异常(标准库提供的时钟、时间点和时长决不抛出)

代码:

技术分享图片
 1 #include <iostream>
 2 #include <chrono>
 3 #include <thread>
 4 using namespace std;
 5 
 6 int main(void) {
 7     cout << "hello waiter" << endl;
 8 
 9     auto start = std::chrono::high_resolution_clock::now();
10     std::this_thread::sleep_for(std::chrono::seconds(2));
11     auto end = std::chrono::high_resolution_clock::now();
12 
13     std::chrono::duration<double, std::milli> elapsed = end - start;
14     cout << "waited " << elapsed.count() << " ms" << endl;
15 
16 // 输出:
17 // hello waiter
18 // waited 2001.44 ms
19 
20     return 0;
21 }
View Code

 

std::this_thread::sleep_until:

定义于头文件 <thread>

templateclass Clock, class Duration >
void sleep_untilconst std::chrono::time_point<Clock,Duration>& sleep_time );

 

阻塞当前线程,直至抵达指定的 sleep_time 。

使用联倾向于 sleep_time 的时钟,这表示时钟调节有影响。从而在调用时间点后,阻塞的时长可能小于,但不会多于 sleep_time - Clock::now() 。函数亦可能阻塞长于抵达 sleep_time 之后,由于调度或资源争议延迟

 

代码:

技术分享图片
 1 #include <iostream>
 2 #include <chrono>
 3 #include <thread>
 4 using namespace std;
 5 
 6 int main(void) {
 7     auto start = std::chrono::high_resolution_clock::now();
 8     std::this_thread::sleep_until(start + std::chrono::seconds(2));
 9     auto end = std::chrono::high_resolution_clock::now();
10 
11     std::chrono::duration<double, std::milli> elapsed = end - start;
12     cout << "waited " << elapsed.count() << " ms" << endl;
13 
14 // 输出:
15 // waited 2001.42 ms
16 
17     return 0;
18 }
View Code

 

c++多线程基础2(命名空间 this_thread)

标签:blog   start   cout   stream   ttl   res   count()   函数   duration   

原文地址:https://www.cnblogs.com/geloutingyu/p/8530239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!