使用MemoryMappedFile流式传输死锁

时间:2012-01-13 07:44:50

标签: c# mutex

我在执行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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

        }
    }
}

答案 1 :(得分:-1)

无需使用同步对象(Mutex)。 MemoryMappedFile是进程之间的线程安全。不要使用互斥锁。并且控制读者可以阅读数据。