一 timed_mutex
-
前文C++11 std::mutex中介绍了,mutex 均具有 lock、 try_lock、unlock等成员函数。
-
timed_mutex 增加了带时限的 try_lock。即 try_lock_for、try_lock_until。
-
定义
// 头文件 <mutex> class timed_mutex; (C++11 起)
二 try_lock_for
-
定义
template< class Rep, class Period > bool try_lock_for( const std::chrono::duration<Rep,Period>& timeout_duration );(C++11 起)
-
尝试锁定互斥,若互斥在指定的时限时期中不可用则返回false, 否则返回true。
-
duration 参见此前文章 C++11 std::duration。
-
demo
#include <mutex>
#include <iostream>
#include <sstream>
#include <thread>
#include <chrono>
std::mutex cout_mutex;
std::timed_mutex mutex;
using namespace std::chrono_literals;
void job(int id) {
std::ostringstream stream;
for (int i = 0; i < 3; ++i) {
if (mutex.try_lock_for(100ms)) {
stream << "success ";
std::this_thread::sleep_for(100ms);
mutex.unlock();
} else {
stream << "failed ";
}
std::this_thread::sleep_for(100ms);
}
std::lock_guard<std::mutex> lock(cout_mutex);
std::cout << "[" << id << "] " << stream.str() << std::endl;
}
int main() {
// try_lock_for
std::vector<std::thread> threads;
for (int i = 0; i < 4; ++i) {
threads.emplace_back(job, i);
}
for (auto& i : threads) {
i.join();
}
}
- 结果
[1] failed failed success
[0] success failed failed
[3] failed success failed
[2] success success success
三 try_lock_until
-
定义
template< class Clock, class Duration > bool try_lock_until( const std::chrono::time_point<Clock,Duration>& timeout_time);(C++11 起)
-
尝试锁定互斥,若直至抵达指定时间点互斥不可用则返回false, 否则返回true。
-
time_point 参见此前文章 C++11 time_point。
-
demo
#include <mutex>
#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
std::timed_mutex test_mutex;
using namespace std::chrono;
void f() {
auto now = steady_clock::now();
if (test_mutex.try_lock_until(now + 10s)) {
std::cout << "get lock." << std::endl;
} else {
std::cout << "try_lock_util timeout." << std::endl;
}
}
int main() {
// try_lock_until
auto start = steady_clock::now();
std::lock_guard<std::timed_mutex> l(test_mutex);
std::thread t(f);
t.join();
auto end = steady_clock::now();
std::cout << "time use: " << duration_cast<milliseconds>(end-start).count()
<< "ms." << std::endl;
}
- 结果
try_lock_util timeout.
time use: 10001ms.
四 recursive_timed_mutex
-
顾名思义,同时满足 recursive_mutex (参见 C++11 recursive_mutex) 和 timed_mutex 的 mutex。
-
定义
// 头文件 <mutex> class recursive_timed_mutex;(C++11 起)