线程锁如何处理后续函数调用序列

时间:2014-06-10 11:27:22

标签: multithreading synchronization locking mutex

线程锁如何处理锁定块仍处于活动状态时到达的消息/函数调用序列?

我已经阅读过有关高级编程模型(例如C#.Net,Java)以及低级编程模型(例如C,汇编)的内容,因此我通常以字节为单位考虑所有问题的基础,因此它给出了每当我试图找到问题的答案时,我都会感到很头疼。

在多线程中,我的一个基本困惑是,锁定如何影响在块被锁定或已被特定进程使用之后到达的消息或函数调用。

操作系统是否处理这些消息序列?操作系统是否提供内部队列或存储来按顺序存储与其到达的序列相对应的消息?

我希望你能在这一点上给我启发。

以下是C#.Net Console App中的示例程序,为简单起见:

using System;
using System.Threading;
using System.IO;

namespace MultiThread
{
    class Program
    {
        static object padlock = new object();

        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                string s = "hello " + i.ToString();
                ThreadPool.QueueUserWorkItem(SayHello, s);
            }

            Console.ReadKey();
        }

        static void SayHello(object message)
        {
            Console.WriteLine(message.ToString() + " start");
            lock (padlock)
            {
                Console.WriteLine(message.ToString() + " running");
                try
                {
                    for (int i = 0; i < 1000; i++)
                    {
                        string[] f = File.ReadAllLines("bigfile.txt");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                Console.WriteLine(message.ToString() + " finish");
            }
            Console.WriteLine(message.ToString() + " end");
        }
    }
}

结果是:

enter image description here

问题:

  1. 注意&#34;你好我开始&#34;序列是0,2,1,3,4,5,6,7,8,9。线程不是基于循环序列顺序启动的。为什么呢?

  2. &#34;你好我开始&#34;位于锁外部,所以我们可以说这部分代码可以被多个线程访问,但是&#34; Hello i正在运行&#34;位于锁内部,因此一次只有一个线程可以进入进程。 &#34;你好我跑步&#34;序列是0,1,5,8,7,4,2,6,3,9。我希望&#34;运行&#34;序列与&#34;起始&#34;相同如果线程进入FIFO,但在这种情况下,运行序列是完全不同的,或者与循环序列或起始序列相比,不遵循某个序列。

  3. 亮点:&#34;你好我开始&#34;显示消息/函数调用的到来。 &#34;你好我跑'#34;显示一次运行的线程序列。

0 个答案:

没有答案