110,538
社区成员
发帖
与我相关
我的任务
分享
public class SendList
{
public List<string> listSend=new List<string>();
public object lockListSend=new object ();
}
/// <summary>
/// Socket 发送队列字典
/// </summary>
static Dictionary<Socket, SendList> dictSocketSendList = new Dictionary<Socket, SendList>();
lock (dictSocketSendList[server].lockListSend)//如何修改能实现当server不同时,不同线程可以执行下面代码块
{
byteData = Encoding.ASCII.GetBytes(dictSocketSendList[server].listSend[0]);
server.Send(byteData, 0, byteData.Length, SocketFlags.None);
dictSocketSendList[server].listSend.RemoveAt(0);
}
static Dictionary<int, object> dictSocketSendList = new Dictionary<int, object>()
{
{0, new object()},
{1, new object()},
{2, new object()},
{3, new object()},
{4, new object()}
};
static void testlock(object obj)
{
Thread.Sleep(10);
lock (dictSocketSendList[(int)obj])
{
Console.WriteLine("enter:" + obj);
Thread.Sleep(2000 + (int)obj * 1000);
}
Console.WriteLine("exit:" + obj);
}
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(testlock, i);
Console.WriteLine("start:" + i);
}
ThreadPool.QueueUserWorkItem(testlock, 3);
Console.WriteLine("startwithlock:" + 3);
ThreadPool.QueueUserWorkItem(testlock, 4);
Console.WriteLine("startwithlock:" + 4);
Console.ReadLine();
}
static Dictionary<int, object> dictSocketSendList = new Dictionary<int, object>()
{
{0, new object()},
{1, new object()},
{2, new object()},
{3, new object()},
{4, new object()}
};
static void testlock(object obj)
{
Thread.Sleep(10);
lock (dictSocketSendList[(int)obj])
{
Console.WriteLine("enter:" + obj);
Thread.Sleep(2000 + (int)obj * 1000);
}
Console.WriteLine("exit:" + obj);
}
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(testlock, i);
Console.WriteLine("start:" + i);
}
ThreadPool.QueueUserWorkItem(testlock, 3);
Console.WriteLine("startwithlock:" + 3);
ThreadPool.QueueUserWorkItem(testlock, 4);
Console.WriteLine("startwithlock:" + 4);
Console.ReadLine();
}
[/quote]
我现在有点不确定lock使用
lock(参数)
{
//代码块
}
1、对参数对象lock成功后,代码块执行完之前,代码块并不互斥,这期间其它线程通过lock其他参数对象成功后,也能执行代码块?
2、lock的参数对象在代码块结束前不能在其他地方再次lock,但是可以访问?
是这样吗?
请问有办法做到令lock的参数对象于代码块执行结束前,不能被其他线程访问吗?