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;
}
}