基本的使用
在并行编程中,访问临界区是经常会遇到的问题,加锁,释放锁是经常会使用到的解决方式。
例如:
lock(_OneObject)
{
Do something with _OneObject ...
}
lock会调用System.Threading.Monitor.Enter方法,然后通过 System.Threading.Monitor.Exit来进行释放。
上面的代码等同与
bool lockToken = false;
try
{
Monitor.Enter(_OneObject, ref lockToken);
Do something with _OneObject ...
}
finally
{
if (lockToken)
Monitor.Exit(_OneObject);
}
比较来看使用lock 代码简洁,而且不用担心Monito.Exit()的释放问题,但Monitor提供了更为丰富的锁控制接口。可以依据实际情况进行选择使用。
代码示例:
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Sample5_2_monitor_lock
{
class Program
{
private static int _TaskNum = 3;
private static Task[] _Tasks;
private static StringBuilder _StrBlder;
private const int RUN_LOOP = 50;
private static void Work1(int TaskID)
{
int i = 0;
string log = "";
bool lockToken = false;
while (i < RUN_LOOP)
{
log = String.Format("Time: {0} Task : #{1} Value: {2} =====\n",
DateTime.Now.TimeOfDay, TaskID, i);
i++;
try
{
lockToken = false;
Monitor.Enter(_StrBlder, ref lockToken);
_StrBlder.Append(log);
}
finally
{
if (lockToken)
Monitor.Exit(_StrBlder);
}
}
}
private static void Work2(int TaskID)
{
int i = 0;
string log = "";
bool lockToken = false;