关于通过共享内存实现多进程通信的有关问题

关于通过共享内存实现多进程通信的问题
通过共享循环缓冲区在进程间传输流媒体..
写进程互斥(这个无所谓 就一个写)
读和写互斥
读和读不互斥,并且读和读同步

个人写了一个,但是开两个读进程的时候画面帧数会很低   找了半天也没找到问题,可能是逻辑问题

在这里求大神能给个性能好的逻辑么
------解决方案--------------------
基于fastCSharp写了一个示例供参考
        unsafe class shareMemoryBase
        {
            internal const string shareMemoryName = "fastCSharp";
            internal const int bufferSize = 1 << 20;
            internal const int errorSize = int.MinValue;
            protected fastCSharp.io.shareMemory shareMemory;
            protected System.Threading.EventWaitHandle serverWait;
            protected System.Threading.EventWaitHandle clientWait;
            protected void dispose()
            {
                fastCSharp.pub.Dispose(ref shareMemory);
                serverWait.Close();
                clientWait.Close();
            }
        }
        unsafe class server : shareMemoryBase
        {
            private byte[] buffer;
            public unsafe server()
            {
                shareMemory = fastCSharp.io.shareMemory.Create(bufferSize + sizeof(int) * 6, shareMemoryName);
                if (shareMemory != null)
                {
                    fastCSharp.unsafer.memory.Fill(shareMemory.Buffer, 0U, 6);
                    buffer = new byte[bufferSize];
                    serverWait = new System.Threading.EventWaitHandle(false, System.Threading.EventResetMode.AutoReset, shareMemory.Name + "s");
                    clientWait = new System.Threading.EventWaitHandle(false, System.Threading.EventResetMode.ManualReset, shareMemory.Name + "c");
                    fastCSharp.threading.threadPool.TinyPool.Start(start);
                }
            }
            private void start()
            {
                int* dataSizePoint = (int*)(shareMemory.Buffer + sizeof(int) * 4);
                try
                {
                    int* dataIndexPoint = (int*)(shareMemory.Buffer + sizeof(int) * 5);
                    byte* data = shareMemory.Buffer + sizeof(int) * 6;
                    fixed (byte* bufferFixed = buffer)
                    {
                        do
                        {
                            *dataIndexPoint += *dataSizePoint;