C# 共享变量同步问题 如何做到实现只是变量互斥,代码快步互斥。十万火急!

ArssieWong 2017-07-26 09:57:47

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);
}

如何修改,使只实现dictSocketSendList[server]互斥,而lock代码快不互斥,不同的dictSocketSendList[server]可以执行lock代码块。即server相同:dictSocketSendList.key=server时只能有一个线程访问,但是其他线程能访问不同server值得dictSocketSendList[server]
...全文
443 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanfei01055 2017-07-27
  • 打赏
  • 举报
回复
你提供的代码貌似没有问题,如果有,那也是语法上的,按理是可以正常lock的。
xdashewan 2017-07-26
  • 打赏
  • 举报
回复
引用 2 楼 ArssieWong 的回复:
但是lock代码块其他线程还是进入不了啊
你可以用这个例子感受下

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();
        }
ArssieWong 2017-07-26
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
直接lock掉server对象不就好了
但是lock代码块其他线程还是进入不了啊
xdashewan 2017-07-26
  • 打赏
  • 举报
回复
直接lock掉server对象不就好了
ArssieWong 2017-07-26
  • 打赏
  • 举报
回复
引用 7 楼 xdashewan 的回复:
[quote=引用 6 楼 ArssieWong 的回复:] 2、同一对象在被释放前可以再次lock?不是要排队等待?还是其他意思?
lock相同对象当然要等待,所以是“依次”执行lock中的代码块,也就是同步,而不是异步执行[/quote] 十分感谢啊! 我一开始写代码的时候是按照你帮忙分析lock那样理解的 但是后来在异步通信时常有长达6秒的延时,还以为是自己之前理解错,所以一度以为lock不同对象时代码块也是互斥的才会这么慢,我再看看代码哪里有问题导致延时
xdashewan 2017-07-26
  • 打赏
  • 举报
回复
引用 6 楼 ArssieWong 的回复:
2、同一对象在被释放前可以再次lock?不是要排队等待?还是其他意思?
lock相同对象当然要等待,所以是“依次”执行lock中的代码块,也就是同步,而不是异步执行
ArssieWong 2017-07-26
  • 打赏
  • 举报
回复
引用 5 楼 xdashewan 的回复:
1.对于同一个lock对象,代码是互斥的,对于不同l的ock对象,当然可以执行代码块 2.当然可以再次lock,lock只是保证同一对象lock时,依次执行lock中的代码块,但没有规定lock的代码块必须一致 3.所有线程都lock同一对象
2、同一对象在被释放前可以再次lock?不是要排队等待?还是其他意思?
xdashewan 2017-07-26
  • 打赏
  • 举报
回复
1.对于同一个lock对象,代码是互斥的,对于不同l的ock对象,当然可以执行代码块 2.当然可以再次lock,lock只是保证同一对象lock时,依次执行lock中的代码块,但没有规定lock的代码块必须一致 3.所有线程都lock同一对象
ArssieWong 2017-07-26
  • 打赏
  • 举报
回复
引用 3 楼 xdashewan 的回复:
[quote=引用 2 楼 ArssieWong 的回复:] 但是lock代码块其他线程还是进入不了啊
你可以用这个例子感受下

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的参数对象于代码块执行结束前,不能被其他线程访问吗?
 本课程的主题是: 透析Linux系统编程    不同于市面上的课程,只会把核心主题放到函数的讲解,本课程的核心主题是 Linux系统编程的经验总结 ;    当你在系统编程中,调用一个系统调用来解决问题时,是否考虑过 该系统调用是否会对系统性能带来影响?是否还有最优的方式?    当你在系统编程过程中,遇到问题,是否只是检查代码逻辑,而不会去深入底层去查找问题 ?    本课程将一一解决系统编程带给你的难点,疑点?    比如控制文件IO章节,给出系统文件操作的默认行为,应用中如何修改这些行为,给出文件IO操作的最优方式;   比如系统调用,给出系统调用原理;系统调用的正确使用方式等   比如进程实现,结合底层,对比线程,深入理解两者;给出进程使用经验总结;   比如线程同步,不仅引出互斥锁 条件变量 自旋锁 读写锁使用方式,同时给出各个机制的应用场景 ;   比如 进程间通信,引出各个进程间通信的机制原理,给出各个进程间通信的应用场景;   比如 信号,给出信号在进程中信号处理处理函数的正确使用方式,给出在多线程中信号处理的正确方式;   比如 共享库,给出共享库的实现机制,给出共享库的正确使用方式;   同时 会讲解 系统安全问题 ; 可执行程序的静态布局和动态布局 ;灵活使用内存映射和虚拟内存;系统事件跟踪;   给出程序性能的调优思路;    丰富的项目实例讲解 ,提供宝贵的商业项目开发经验 ; 

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧