Home > Blockchain >  Unlocks all pthread mutexes in mutex array
Unlocks all pthread mutexes in mutex array

Time:03-14

Im trying to write a function that unlocks all pthread mutexes provided in an array of mutexes.

The array is mutexv and the number of mutexes in given by mutexc.

The function should return 0 on success, -1 otherwise.

my function so far:

#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;
}

having a hard time figuring out what im doing wrong.

CodePudding user response:

// 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;
}

Actually a while loop can be more elegant:

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;
        }
    }
}

Finally: You don't give any information on how many mutexes actually could be unlocked (or alternatively, how many have not) – you might return that number instead of -1, then any value different from originally passed mutexc would mean an error occurred.

  • Related