C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- std::thread
- std::stop_token
- std::stop_source
- std::stop_callback
- std::this_thread::get_id
- std::shared_timed_mutex
- std::shared_lock
- std::lock_guard
- std::hardware_destructive_interference_size, std::hardware_constructive_interference_size
- std::counting_semaphore, std::binary_semaphore
- std::jthread
- cpp/thread/barrier
- std::future
- std::this_thread::yield
- std::this_thread::sleep_for
- std::this_thread::sleep_until
- std::mutex
- std::recursive_mutex
- std::shared_mutex
- std::timed_mutex
- std::recursive_timed_mutex
- std::scoped_lock
- std::unique_lock
- std::defer_lock_t, std::try_to_lock_t, std::adopt_lock_t
- std::lock
- std::try_lock
- std::defer_lock, std::try_to_lock, std::adopt_lock
- std::once_flag
- std::call_once
- std::condition_variable
- std::condition_variable_any
- std::notify_all_at_thread_exit
- std::cv_status
- std::latch
- std::promise
- std::shared_future
- std::packaged_task
- std::async
- std::launch
- std::future_status
- std::future_error
- std::future_category
- std::future_errc
- 注é
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >çº¿ç¨æ¯æåº > std::try_lock
std::try_lock
| å®ä¹äºå¤´æä»¶ <mutex>
|
||
| template< class Lockable1, class Lockable2, class... LockableN> int try_lock( Lockable1& lock1, Lockable2& lock2, LockableN&... lockn); |
(C++11 èµ·) | |
å°è¯é宿¯ä¸ªç»å®çå¯éå® (Lockable) 对象 lock1 ã lock2 ã ... ã lockn ï¼éè¿ä»¥ä»å¤´å¼å§ç顺åºè°ç¨ try_lock ã
è¥è°ç¨ try_lock 失败ï¼åä¸åè¿ä¸æ¥è°ç¨ try_lock ï¼å¹¶å¯¹ä»»ä½å·²é对象è°ç¨ unlock ï¼è¿åéå®å¤±è´¥å¯¹è±¡ç 0 åºä¸æ ã
è¥è°ç¨ try_lock æåºå¼å¸¸ï¼åå¨éæå对任ä½å·²é对象è°ç¨ unlock ã
åæ°
| lock1, lock2, ... , lockn | - | è¦éå®çå¯éå® (Lockable) 对象 |
è¿åå¼
æåæ¶ä¸º -1 ï¼å¦å为éå®å¤±è´¥å¯¹è±¡ç 0 åºä¸æ å¼ã
示ä¾
ä¸å示ä¾ç¨ std::try_lock 卿å°è®°å½å¹¶éç½®è¿è¡äºå离线ç¨ç计æ°å¨ã
è¿è¡æ¤ä»£ç
#include <mutex> #include <vector> #include <thread> #include <iostream> #include <functional> #include <chrono> Â int main() { int foo_count = 0; std::mutex foo_count_mutex; int bar_count = 0; std::mutex bar_count_mutex; int overall_count = 0; bool done = false; std::mutex done_mutex; Â auto increment = [](int &counter, std::mutex &m, const char *desc) { for (int i = 0; i < 10; ++i) { std::unique_lock<std::mutex> lock(m); ++counter; std::cout << desc << ": " << counter << '\n'; lock.unlock(); std::this_thread::sleep_for(std::chrono::seconds(1)); } }; Â std::thread increment_foo(increment, std::ref(foo_count), std::ref(foo_count_mutex), "foo"); std::thread increment_bar(increment, std::ref(bar_count), std::ref(bar_count_mutex), "bar"); Â std::thread update_overall([&]() { done_mutex.lock(); while (!done) { done_mutex.unlock(); int result = std::try_lock(foo_count_mutex, bar_count_mutex); if (result == -1) { overall_count += foo_count + bar_count; foo_count = 0; bar_count = 0; std::cout << "overall: " << overall_count << '\n'; foo_count_mutex.unlock(); bar_count_mutex.unlock(); } std::this_thread::sleep_for(std::chrono::seconds(2)); done_mutex.lock(); } done_mutex.unlock(); }); Â increment_foo.join(); increment_bar.join(); done_mutex.lock(); done = true; done_mutex.unlock(); update_overall.join(); Â std::cout << "Done processing\n" << "foo: " << foo_count << '\n' << "bar: " << bar_count << '\n' << "overall: " << overall_count << '\n'; }
å¯è½çè¾åºï¼
bar: 1 foo: 1 foo: 2 bar: 2 foo: 3 overall: 5 bar: 1 foo: 1 bar: 2 foo: 2 bar: 3 overall: 10 bar: 1 foo: 1 bar: 2 foo: 2 overall: 14 bar: 1 foo: 1 bar: 2 overall: 17 foo: 1 bar: 1 foo: 2 overall: 20 Done processing foo: 0 bar: 0 overall: 20
åé
| (C++11) |
é宿å®çäºæ¥ä½ï¼è¥ä»»ä½ä¸ä¸ªä¸å¯ç¨åé»å¡ (彿°æ¨¡æ¿) |