本文主要介绍c++多线程中try_to_lock的用法。首先,用一个实例说明,使用try_to_lock的必要性。
假设线程1 执行下例代码时,先锁定互斥量myMutex1,然后暂停了2s,才继续执行程序。线程1执行的代码如下:
bool outMsgProc(int &num)
{
unique_lock<mutex> guard(myMutex1);
chrono::milliseconds time(2000); //线程暂停2s
this_thread::sleep_for(time);
if (!myList.empty())
{
num = myList.front();
myList.pop_front();
return true;
}
return false;
}
在此期间,如果线程2也尝试锁定myMutex1,就只能阻塞,直到线程1释放锁后,才能继续执行。线程2执行的代码如下:
void InMsg()
{
for (int i = 0; i < 10000; i++)
{
cout << "插入元素: " << i << endl;
unique_lock<mutex> guard(myMutex1);
myList.push_back(i);
}
}
显然,这样的程序效率不高。线程2花费了太多的时间等待。
我们考虑使用try_to_lock,线程尝试获取锁,如果没有锁定成功,它不会阻塞在那里,可以去执行其他代码。改进后的代码如下:
void InMsg()
{
for (int i = 0; i < 10000; i++)
{
cout << "插入元素: " << i << endl;
unique_lock<mutex> guard(myMutex1, try_to_lock);
if (guard.owns_lock())
{
myList.push_back(i);
}
else
{
//没有拿到锁时,执行的代码
}
}
}