c++多线程(四)- try_to_lock

    本文主要介绍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
		{
			//没有拿到锁时,执行的代码
		}
	}
}

猜你喜欢

转载自blog.csdn.net/liyazhen2011/article/details/86652264