C как упаковать мьютекс блокировку доступа к структуре внутри функции - PullRequest
0 голосов
/ 13 мая 2018

У меня есть код, который реализует потоки, которые совместно используют ряд простых счетчиков, и я сгруппировал их в структуру, чтобы немного убрать код. Так что теперь я должен получить доступ к счетчикам внутри структуры по ее имени, но в то же время заблокировать структуру с помощью мьютекса. Пока все хорошо, проблем нет, но по причинам обслуживания и простоты кода я хотел бы упаковать блокировку взаимной блокировки структуры и доступ к любому из ее членов в функцию, где я использую в качестве входного аргумента имя члена что я хочу прочитать или изменить.

Я не знаю, возможно ли это или даже удобно, я имею в виду, что использование одного мьютекса для всех счетчиков, используемых всеми потоками, может быть плохой идеей, учитывая тот факт, что один счетчик обычно используется только двумя потоками.

Так вот почему я приехал сюда, чтобы узнать мнение об этом и дать советы о том, как это можно сделать


Чтобы лучше объяснить, что я ищу.

У меня есть структура счетчиков, которая используется в разных потоках

struct SHARED_DATA
{
 unsigned int counter1;
 unsigned int counter2;
 unsigned int counter3;
}

Скажем, структура определена как глобальная

struct SHARED_DATA shared_data = {0};

Итак, я должен получить доступ к счетчикам индивидуально, но я бы хотел упаковать доступ к элементам, одновременно блокируя структуру с мьютексом, все это внутри функции, входной аргумент которой является именем члена структура, которую я хочу прочитать или обновить. Как то так

unsigned int Read_Counters(const char counter)
{
 unsigned int value;
 pthread_mutex_lock(pthread_mutex_shared_data);
 value = shared_data.counter;
 pthread_mutex_unlock(pthread_mutex_shared_data);
 return value;
}

1 Ответ

0 голосов
/ 13 мая 2018

Я не уверен, что понял вашу проблему.

Если я правильно понимаю, вам НЕ нужен один мьютекс для всей структуры, и вы хотите, чтобы мьютекс был упакован ВНУТРИ структуры.

Вы могли бы сделать что-то вроде этого:

typedef struct{ 
    int shared1;
    pthread_mutex_t mutex1;
    int shared2;
    pthread_mutex_t mutex2;
} shared_resources;

void touch_shared_esources(shared_resources* shared_things) {
    pthread_mutex_lock(&shared_things->mutex1);
    shared_things->shared1++;
    pthread_mutex_unlock(&shared_things->mutex1);
}

EDIT:

Итак, вы хотите иметь функцию, отвечающую за чтение значения структуры, верно?

Вы могли бы сделать что-то вроде этого:

void read() {
    static pthread_mutex_t mutex;
    pthread_mutex_lock(&mutex);
    // do things to shared data
    pthread_mutex_unlock(&mutex);
}
...