解锁互斥量数组中的所有 pthread 互斥量

Unlocks all pthread mutexes in mutex array

我正在尝试编写一个函数来解锁互斥量数组中提供的所有 pthread 互斥量。

数组为 mutexv,互斥量 in 由 mutexc 给出。

函数应该 return 0 成功, -1 否则。

我目前的功能:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <alloca.h>
#include "pthread.h"
#include "multi_mutex.h"

int multi_mutex_unlock(pthread_mutex_t **mutexv, int mutexc)
{
    (void) mutexv;
    (void) mutexc;
    pthread_mutex_init(*mutexv, NULL);

    for (int i=0; i<mutexc; i++){
        if (pthread_mutex_unlock(*mutexv) !=0){
            return -1;
        }
    }
    return 0;
}

很难弄清楚我做错了什么。

// correct type for specifying array sizes is size_t, not int:
int multi_mutex_unlock(pthread_mutex_t **mutexv, size_t mutexc)
{
    // you wouldn't initialize here, that needs to occur much earlier
    //pthread_mutex_init(*mutexv, NULL);

    for (size_t i = 0; i < mutexc; i++)
    {
        if (pthread_mutex_unlock(mutexv[i]) != 0)
        // you need to index properly  ^^^
        {
            return -1;
        }
    }
    return 0;
}

实际上while循环可以更优雅:

int multi_mutex_unlock(pthread_mutex_t **mutexv, size_t mutexc)
{
    while(mutexc)
    {
        if (pthread_mutex_unlock(*mutexv) != 0)
        {
            return -1;
        }
        mutexc--; // decrement the remaining number
        mutexv++; // increment the pointer to point to next mutex
    }
    return 0;

    // or totally compact as:
    for(; mutexc; --mutexc, ++mutexv)
    {
        if (pthread_mutex_unlock(*mutexv) != 0)
        {
            return -1;
        }
    }
}

最后:您没有提供任何关于实际可以解锁多少互斥体的信息(或者,有多少没有)——您可能 return 这个数字而不是 -1,然后任何不同的值来自最初传递的 mutexc 将意味着发生错误。