2012-01-13 63 views
2

執行MemoryMappedFile流式傳輸時出現小問題。 我有2個項目,一個用於發送字節,另一個用於讀取字節。這兩個進程之間應該是一個2秒鐘的睡眠計時器。與MemoryMappedFile流式傳輸的死鎖

我已經實現了所有這些,但是當軟件嘗試執行讀取時,它似乎遇到了死鎖。這兩個過程的代碼如下。

任何人都可以幫我找到問題嗎?

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(); 
     } 
    } 
} 
+0

準確地說,描述出現死鎖的位置/時間。寫作開始了嗎? – 2012-01-13 09:47:03

+0

作者將通過循環第二次在ReleaseMutex調用中崩潰。它沒有獲得互斥體。單個互斥體不足以同步讀寫器。你真的想在這裏使用一個命名管道。 – 2012-01-13 13:12:57

回答

-1

沒有必要使用同步對象(互斥)。 MemoryMappedFile是進程之間的線程安全。不要使用互斥鎖。並控制閱讀器讀取數據。

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

     } 
    } 
}