C#中的CRITICAL_SECTION [英] CRITICAL_SECTION in c#

查看:169
本文介绍了C#中的CRITICAL_SECTION的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

全部.我需要在C#代码中使用winapi关键部分.

All. I need to use winapi critical section in c# code.

首先,我导入函数:

[StructLayout(LayoutKind.Sequential)]
public struct CRITICAL_SECTION { public int dummy; }

// INIT CRITICAL SECTION
[DllImport("kernel32.dll")]
static extern bool InitializeCriticalSectionAndSpinCount(ref CRITICAL_SECTION
   lpCriticalSection, uint dwSpinCount);

// DELETE CRITICAL SECTION
[DllImport("kernel32.dll")]
static extern void DeleteCriticalSection(ref CRITICAL_SECTION
   lpCriticalSection);

// ENTER CRITICAL SECTION
[DllImport("kernel32.dll")]
static extern void EnterCriticalSection(ref CRITICAL_SECTION
   lpCriticalSection);

// LEAVE CRITICAL SECTION
[DllImport("kernel32.dll")]
static extern void LeaveCriticalSection(ref CRITICAL_SECTION
   lpCriticalSection);

通过这种方式,我尝试使用关键部分:

In this way I try to use critical section:

static void Main(string[] args)
            {
                GenerateArray();

                InvokeThread invokeThread = () =>
                {
                    WaitForSingleObject(ghSemaphore, 0);
                    EnterCriticalSection(ref CriticalSection);   // critical section

                    int[] array = new int[ARRAY_SIZE_PER_THREAD];
                    int baseI = thread * ARRAY_SIZE_PER_THREAD;
                    for (int i = 0; i < ARRAY_SIZE_PER_THREAD; ++i)
                    {
                        array[i] = gList[baseI + i];
                    }

                    LeaveCriticalSection(ref CriticalSection);       // critical section
                    ReleaseSemaphore(ghSemaphore, 1, IntPtr.Zero);

                    return 0;
                };

                ghSemaphore = CreateSemaphore(ref seqAttr, THREADS_NUMBER, THREADS_NUMBER, "");
                InitializeCriticalSectionAndSpinCount(ref CriticalSection, 0);                           

                IntPtr threadPtr = Marshal.GetFunctionPointerForDelegate(invokeThread);

                IntPtr[] handlers = new IntPtr[THREADS_NUMBER];
                for (int i = 0; i < THREADS_NUMBER; ++i)
                {
                    int handle = CreateThread(IntPtr.Zero, 0, threadPtr, IntPtr.Zero, 0, 0);
                    handlers[i] = new IntPtr(handle);
                }

                WaitForMultipleObjects(THREADS_NUMBER, handlers, true, Infinite);    
                DeleteCriticalSection(ref CriticalSection); // delete critical section
            }
        }

但是在下一行gList包含错误的值.如果我不使用关键部分,那么一切都很好.

But at next line gList containes wrong values. And every thing is good, if I don't use critical section.

for (int i = 0; i < ARRAY_SIZE_PER_THREAD; ++i)
{
    array[i] = gList[baseI + i];
}

哪里有问题?

推荐答案

您对CRITICAL_SECTION结构的定义是错误的.在Windows标头中大约有24个字节,但您的只有4个字节.

Your definition of the CRITICAL_SECTION struct is wrong. In the Windows headers is has 24 bytes or so, but yours has only 4.

此外,您也不会执行new CRITICAL_SECTION.并且您需要它,InitializeCriticalSection设置数据,但是不分配它.

Also, you don't do new CRITICAL_SECTION anywere. And you need it, InitializeCriticalSection sets the data, but don't allocate it.

这篇关于C#中的CRITICAL_SECTION的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆