Реализация синхронизированной структуры данных в C - PullRequest
2 голосов
/ 29 марта 2011

Здравствуйте, я создал хеш-таблицу на C. Я достаточно тестировал ее, чтобы убедиться, что она работает. Дело в том, что структура данных будет динамически связана с кодом, который я не писал, и, возможно, использует потоки. Поэтому мне нужно синхронизировать его, чтобы он работал корректно для теоретически любого количества потоков, одновременно изменяющих / читающих его. Изучив pthread mutex API, я сделал следующее

Объявлена ​​статическая глобальная переменная:

static pthread_mutex_t lock;

В HashTable_init (который всегда вызывается перед использованием хеш-таблицы) я запускаю его:

pthread_mutex_init(&lock,NULL);

Для каждой функции, которая читает / записывает структуру, я ставлю блокировку при запуске:

pthread_mutex_lock(&lock);

и разблокировать в конце:

pthread_muter_unlock(&lock);

Этого достаточно, чтобы синхронизировать структуру данных? (так как на данный момент моя программа зависает).

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Этого может быть недостаточно. Блокируя каждый метод, вы гарантируете, что внутренняя структура вашего контейнера будет согласованной в любой точке; но в некоторых случаях использование контейнера может потребовать большего.

Рассмотрим следующий довольно простой случай: в одном потоке вы нашли элемент по определенному ключу и приступили к его редактированию. Когда find () завершается, он снимает блокировку и затем возвращает ссылку на элемент. Тем временем блокировка может быть получена, и другой поток может, например, удалить этот элемент, что довольно неожиданно для первого потока.

Проектирование и разработка хорошего и безопасного параллельного контейнера - задача не из легких. Я бы рекомендовал вам вместо этого искать готовые решения.

1 голос
/ 29 марта 2011

Кажется, все в порядке, если только вы убедитесь, что init вызывается только один раз первым потоком и до того, как другие потоки начнут обращаться к мьютексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...