【问题标题】:Deadlock with MemoryMappedFile streamingMemoryMappedFile 流式死锁
【发布时间】:2012-02-09 11:14:11
【问题描述】:

我在执行 MemoryMappedFile 流式传输时遇到了一个小问题。 我有 2 个项目,一个用于发送字节,另一个用于读取字节。在这两个进程之间应该有一个 2 秒的睡眠定时器。

我已经实现了所有这些,但是当软件尝试进行读取时,它似乎遇到了死锁。两个进程的代码如下。

谁能帮我找到问题?

namespace ProcesComunication
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryMappedFile mmf = MemoryMappedFile.CreateNew("AAB", 1024);
            MemoryMappedViewStream mStream = mmf.CreateViewStream();
            BinaryWriter bw = new BinaryWriter(mStream);
            Mutex mx = new Mutex(true, "sync");
            while (true)
            {
                Thread.Sleep(2000);
                Console.WriteLine("TEST");
                bw.Write(DateTime.Now.ToString());
                mx.ReleaseMutex();
            }

            bw.Close();
            mStream.Close();
        }
    }
}

namespace ProcesRead
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("AAB");
            MemoryMappedViewStream mStream = mmf.CreateViewStream();
            BinaryReader br = new BinaryReader(mStream);

            Mutex mx = Mutex.OpenExisting("sync");
            while (true)
            {
                mx.WaitOne();
                Console.Write(br.ReadString());
                 mx.ReleaseMutex();  
            }

            br.Close();
            mStream.Close();
        }
    }
}

【问题讨论】:

  • 准确地说,描述死锁出现的位置/时间。写作是否开始了?
  • 编写器将在循环中第二次调用 ReleaseMutex 时崩溃。它没有获得互斥锁。单个互斥锁不足以同步读取器和写入器。您真的想在这里使用命名管道。

标签: c# mutex


【解决方案1】:

我尝试并找到了简单的解决方案,下面是代码: 感谢所有贡献者的回答。

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    using System.IO.MemoryMappedFiles;


    namespace ProcesComunication
    {
        class Program
        {
            static void Main(string[] args)
            {
                MemoryMappedFile mmf = MemoryMappedFile.CreateNew("AAB", 1024);
                MemoryMappedViewStream mStream = mmf.CreateViewStream();
                BinaryWriter bw = new BinaryWriter(mStream);
                Mutex mx = new Mutex(true, "sync");
                while (true)
                {
                    mx.WaitOne();
                    Thread.Sleep(2000);
                    var random = new Random();
                    var nextValue = random.Next().ToString();
                    Console.WriteLine(nextValue);
                    bw.Write(nextValue);
                    mx.ReleaseMutex();
                }
                bw.Close();
                mStream.Close();

            }
        }
    }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.IO.MemoryMappedFiles;

namespace ProcesRead
{
    class Program
    {
        static void Main(string[] args)
        {

            MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("AAB");
            MemoryMappedViewStream mStream = mmf.CreateViewStream();
            BinaryReader br = new BinaryReader(mStream);

            Mutex emx = Mutex.OpenExisting("sync");
         while (true)
            {
                Console.WriteLine(br.ReadString());
                emx.WaitOne(2000);
            }
            br.Close();
            mStream.Close();

        }
    }
}

【讨论】:

    【解决方案2】:

    不需要使用同步对象(Mutex)。 MemoryMappedFile 是进程之间的线程安全。不要使用互斥锁。并控制阅读器对其有数据进行阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多