std::mutex::try_lock
来自cppreference.com
<tbody>
</tbody>
bool try_lock(); |
(C++11 起) | |
尝试锁定互斥体。立即返回。成功获得锁时返回 true,否则返回 false。
允许此函数虚假地失败而返回 false,即使互斥体当前未被任何其他线程锁定。
若已占有 mutex 的线程调用 try_lock,则行为未定义。
若此操作返回 true,则同一互斥体上的先前 unlock() 操作同步于(定义于 std::memory_order)它。注意若此操作返回 false,则先前的 lock() 不与之同步。
参数
(无)
返回值
若成功取得锁则为 true,否则为 false。
异常
不抛出。
示例
运行此代码
#include <chrono>
#include <iostream> // std::cout
#include <mutex>
#include <thread>
std::chrono::milliseconds interval(100);
std::mutex mutex;
int job_shared = 0; // 两个线程都能修改 'job_shared',
// mutex 将保护此变量
int job_exclusive = 0; // 只有一个线程能修改 'job_exclusive'
// 不需要保护
// 此线程能修改 'job_shared' 和 'job_exclusive'
void job_1()
{
std::this_thread::sleep_for(interval); // 令 'job_2' 持锁
while (true)
{
// 尝试锁定 mutex 以修改 'job_shared'
if (mutex.try_lock())
{
std::cout << "共享任务 (" << job_shared << ")\n";
mutex.unlock();
return;
}
else
{
// 不能获取锁以修改 'job_shared'
// 但有其他工作可做
++job_exclusive;
std::cout << "排他任务 (" << job_exclusive << ")\n";
std::this_thread::sleep_for(interval);
}
}
}
// 此线程只能修改 'job_shared'
void job_2()
{
mutex.lock();
std::this_thread::sleep_for(5 * interval);
++job_shared;
mutex.unlock();
}
int main()
{
std::thread thread_1(job_1);
std::thread thread_2(job_2);
thread_1.join();
thread_2.join();
}
可能的输出:
排他任务 (1)
排他任务 (2)
排他任务 (3)
排他任务 (4)
共享任务 (1)
参阅
| 锁定互斥体,若互斥体不可用则阻塞 (公开成员函数) | |
| 解锁互斥体 (公开成员函数) | |
mtx_trylock 的 C 文档
| |