c++11之thread
包含头文件:#include <thread>
c++11之chrono
包含头文件:#include <chrono>
chrono是一个日期时间相关的库,比较常用的就是处理thread的睡眠时间
我们知道,在Linux系统里面,线程延时都是使用sleep(x)来进行延时的,而c++11的thread延时则是如下:
std::this_thread::sleep_for(std::chrono::milliseconds(100));
其中,std::chrono::milliseconds(100) 则是用来获取1个100ms的延时周期。
c++11之互斥量
- std::mutex & std::lock_guard & std::unique_lock
- std::timed_mutex
- std::recursive_mutex
- std::recursive_timed_mutex
unique_lock 具有 lock_guard 的所有功能。
c++11之信号量
信号量(semphore)是线程同步时经常使用的一个很重要的应用,But ,c++11的多线程里面并没有引进信号量(semphore)。
而是以 mutex 和 condition_variable 组合使用的。
下面是一段 std::unique_lock 和 condition_variable 组合当做信号量使用的示例:
task_1 每次必须等待 task_2 释放掉信号量后才能执行,否则处于阻塞等待状态
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
std::mutex my_mutex; //创建1个互斥量
std::condition_variable cv; //创建1个条件变量
int task_1();
int task_2();
int main()
{
std::thread t1(task_1);
std::thread t2(task_2);
// t1.join();
// t2.join();
t1.detach();
t2.detach();
std::cout << "Hello World" << std::endl;
system("pause");
return 0;
}
int task_1()
{
int tickets = 0;
for (;;)
{
std::unique_lock<std::mutex> locker(my_mutex);
cv.wait(locker); //相当于等待1个信号量
std::cout << "thread_1:" << tickets++ << std::endl;
//std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
int task_2()
{
for (;;)
{
std::this_thread::sleep_for(std::chrono::seconds(2));
cv.notify_one(); //相当于 semaphore_release
std::cout << "接球" << std::endl;
}
}