Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 线程锁如何处理后续函数调用序列_Multithreading_Synchronization_Locking_Mutex - Fatal编程技术网

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

Multithreading 线程锁如何处理后续函数调用序列,multithreading,synchronization,locking,mutex,Multithreading,Synchronization,Locking,Mutex,线程锁如何准确地处理在锁定块仍处于活动状态时到达的消息/函数调用序列 我读过关于高级编程模型(例如C#.Net、Java)和低级编程模型(例如C、Assembly)的书,因此我通常认为字节是我所有问题的基础,因此每当我试图找到问题的答案时,它都会让我非常头痛 在多线程中,我的一个基本困惑是,锁定如何影响稍后在块被锁定或已被特定进程使用之后到达的消息或函数调用 操作系统是否按顺序处理这些消息?操作系统是否提供了一个内部队列或存储器来按顺序存储与消息到达顺序相对应的消息 我希望你能在这一点上启发我

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

我读过关于高级编程模型(例如C#.Net、Java)和低级编程模型(例如C、Assembly)的书,因此我通常认为字节是我所有问题的基础,因此每当我试图找到问题的答案时,它都会让我非常头痛

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

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

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

为了简单起见,下面是C#.Net控制台应用程序中的示例程序:

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");
        }
    }
}
使用系统;
使用系统线程;
使用System.IO;
名称空间多线程
{
班级计划
{
静态对象挂锁=新对象();
静态void Main(字符串[]参数)
{
对于(int i=0;i<10;i++)
{
字符串s=“hello”+i.ToString();
QueueUserWorkItem(SayHello,s);
}
Console.ReadKey();
}
静态void SayHello(对象消息)
{
Console.WriteLine(message.ToString()+“start”);
锁(挂锁)
{
Console.WriteLine(message.ToString()+“running”);
尝试
{
对于(int i=0;i<1000;i++)
{
字符串[]f=File.ReadAllLines(“bigfile.txt”);
}
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
Console.WriteLine(message.ToString()+“finish”);
}
Console.WriteLine(message.ToString()+“end”);
}
}
}
结果是:

问题:

  • 请注意,“helloistart”序列是0、2、1、3、4、5、6、7、8、9。线程不是根据循环顺序顺序启动的。为什么?

  • “Hello i start”位于锁的外部,因此我们可以说这部分代码可以由多个线程访问,但“Hello i running”位于锁的内部,因此一次只能有一个线程进入进程。“hello i running”序列是0、1、5、8、7、4、2、6、3、9。如果线程采用FIFO,我希望“运行”序列与“启动”序列相同,但在这种情况下,与循环序列或启动序列相比,运行序列完全不同或不遵循特定序列


  • 亮点:“Hello i start”显示消息/函数调用的到达。“Hello i running”显示了单个时间运行的线程的顺序

    不清楚你在问什么。一个特定的例子,例如一些说明您的问题的伪代码,可能会有所帮助。嗨@AlexeyKukanov,我已经编辑了这个问题以显示伪代码和结果。