Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何等待直到互斥锁解锁?_C++_Multithreading_Winapi - Fatal编程技术网

C++ 如何等待直到互斥锁解锁?

C++ 如何等待直到互斥锁解锁?,c++,multithreading,winapi,C++,Multithreading,Winapi,有一个互斥量数组。 我的职能: 检查互斥锁是否已锁定 2a。如果没有,则锁定它 2b。如果已锁定,请等待解锁并将其锁定 另一个函数将其解锁 问题是我在等待区遇到车祸: HANDLE mutexes[N]; void func(int i) { // (*) wait until unlocked or create if unlocked while ((mutexes[i] = CreateMutex(NULL, TRUE/*same with FALSE*/, NULL)) !=

有一个互斥量数组。 我的职能:

  • 检查互斥锁是否已锁定
  • 2a。如果没有,则锁定它

    2b。如果已锁定,请等待解锁并将其锁定

    另一个函数将其解锁

    问题是我在等待区遇到车祸:

    HANDLE mutexes[N];
    
    void func(int i)
    {
      // (*) wait until unlocked or create if unlocked
      while ((mutexes[i] = CreateMutex(NULL, TRUE/*same with FALSE*/, NULL)) != NULL);
      /*or WaitForSingleObject(mutexes[i], INFINITE)*/
    
      mutexes[i] = CreateMutex(NULL, TRUE, NULL);
    }
    
    在(*)点,我遇到了崩溃访问冲突。当它试图创建之前已经创建的互斥锁[i]时,会发生崩溃。我不能使用WaitForSingleObject,因为第一次没有创建互斥体[I],文档说WaitForSingleObject未定义。如果我使用这个函数,我也会遇到同样的崩溃

    我所需要的只是这种简单伪代码的模拟

    if (mutex_has_been_created[mutexes[i]])
      WaitUntilRelease()
    CreateMutex();
    
    我试着把它包装在一个关键的部分,得到了同样的结果。我确信
    I
    在正确的范围内。 我不能使用Boost/pThreads/etc

    我知道我的问题很简单,但我找不到解决办法。在我看到的所有示例中,互斥体都是在
    WaitForSingleObject
    之前创建的,这对我不起作用


    谢谢。

    您确实需要理清代码的逻辑:互斥体的创建和锁定/解锁是不同的操作,应该这样对待。坦率地说,所有这些“试图创建已经创建的互斥体”的业务都没有多大意义

    简而言之:

  • 初始化(“创建”)互斥体
  • 等锁定互斥锁(或超时)
  • 打开它
  • 摧毁它
  • 您可以创建/销毁互斥锁一次,并在其间根据需要多次锁定/解锁互斥锁


    当你试图锁定一个已经被其他人锁定的互斥锁时,你的线程会自动阻塞,直到互斥锁可用。

    对于posix线程,你可能会使用;我不知道WinAPI是否提供了类似的功能。

    如果您想等到它解锁后才锁定它,那么您可以锁定它。这正是你这样做的结果。当您尝试锁定时,代码将阻塞,直到互斥锁可用,然后锁定它。

    处理互斥锁[N]
    
    HANDLE mutexes[N]
    
    void InitMutexes(int N)
    {
        for (int i =0; i < N ; i++)
        {           
            mutexes[i] = CreateMutex( NULL, FALSE, NULL);
        }
    }
    void WaitForMutex(int n)
    {
        WaitForSingleObject(mutexes[n], INFINITE);
    }
    void ReleaseMutex(int n)
    {
        ReleaseMutex(mutexes[n]);
    }
    void CleanUpMutexes(int N)
    {
        for (int i=0; i < N; i++)
        {
              ReleaseMutex(mutexes[i]); CloseHandle(mutexes[i]);
        }
    }
    
    void initmutex(int N) { 对于(int i=0;i

    希望有帮助。

    我以为CreateMutex的意思是锁定它。我没有找到“LockMutex”函数或其他东西。@fogbit:没有,CreateMutex初始化互斥体。WaitForSingleObject将其锁定。查看我的更新答案。我不知道如何锁定它。我认为“创建互斥”意味着“锁定”它。如果没有,我如何在winapi中锁定它?这就是
    WaitForSingleObject
    所做的。