为每个结构使用多个互斥锁的最佳方法? (例如 2 个结构由 4 个线程操作)

best way to use multiple mutex one for each structure ? (2 structures being manipulated by 4 threads for example)

我第一次在 C 中使用线程进行“大规模”工作,我不确定如何正确使用多个互斥锁,每个互斥锁保护一个结构和可能被多个线程操纵的结构

考虑以下代码


#include <pthread.h>
#include <stdlib.h>

struct example{
    int parameter;
};

void *do_something(void *argument);

int main(){
    struct example *ex1 = (struct example *) malloc(sizeof(struct example));
    struct example *ex2 = (struct example *) malloc(sizeof(struct example));
    
    ex1->parameter = 5;
    ex2->parameter = 4;

    pthread_t thread1;
    pthread_t thread2;
    pthread_t thread3;
    pthread_t thread4;

    pthread_create(&thread1,NULL, do_something, ex1);
    pthread_create(&thread2,NULL, do_something, ex1);
    pthread_create(&thread3,NULL, do_something, ex2);
    pthread_create(&thread4,NULL, do_something, ex2);

    return 0;
}

void *do_something(void *argument){
    struct example *something = (struct example *) argument;
    something->parameter = something->parameter +1; 
    return NULL;
}

在上面的代码中,为 ex1 分配两个互斥锁,一个为 ex2 分配另一个互斥锁的最佳方法是什么?我脑子里有几个想法,但我不确定哪个可行,哪个会造成灾难 例如


struct parameters{
    struct example *example;
    pthread_mutex_t lock;
};

struct parameters *param
pthread_create(&thread1,NULL, do_something, param);

或者甚至可能在第一个结构中包含互斥锁,就像

struct example{
    int parameter;
    pthread_mutex_t lock;
};

我不确定哪个更好,或者两者是否都可用,我很想听听一些意见、指示甚至阅读建议,然后再投入到一种方法中,结果证明这是一场灾难

what is the best way to assign two mutex one for ex1 and the other for ex2 in the code above?

将单独的互斥锁与给定结构类型的每个实例相关联的最自然方法是使其成为该类型的成员。这并不总是可能的,但是当您以任何其他方式形成关联时,您很容易遇到如何从给定结构实例确定哪个是与之相关的互斥体的问题。

也就是说,如果它是 struct example 您想要互斥量那么

struct example{
    int parameter;
    pthread_mutex_t lock;
};