как получить доступ к локальному хранилищу с помощью pthreads - PullRequest
4 голосов
/ 11 декабря 2010

У меня есть код, который полностью параллелен, без зависимостей, поэтому использование pthreads было естественным выбором.К сожалению, есть один общий ресурс, файл журнала.

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

В настоящее время у меня есть два решения, ни одно из которых меня не радует.

  1. Реализация хэша для идентификатора потока: pthread_self ().
  2. Передача параметра из создания потока в каждую вызываемую им функцию (очень инвазивную).

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

Ответы [ 3 ]

4 голосов
/ 11 декабря 2010

Существует стандартный способ обработки таких переменных для каждого потока: pthread_key_create и компания.

Если вы просто довольны gcc и его расширениями, у них есть ключевое слово __thread для хранения каждого потока.

4 голосов
/ 11 декабря 2010

Если каждый поток получает свой собственный журнал, используйте pthread_key_create и связанные с ним функции для поддержки переменной средства ведения журнала для каждого потока.

2 голосов
/ 11 декабря 2010

Хорошее исправление : больше не используйте глобальную переменную, и у каждого потока есть свой собственный объект журнала.

Быстрое исправление : преобразуйте глобальную переменную вашего регистратора в макрос, который расширяется до вызова функции регистрации, передавая идентификатор потока. Или используйте собственные возможности pthreads для локального хранения в потоке (см. Ключи pthread).

Итак, допустим, у вас есть:

log(global_fd, char* entry);

Вы можете избежать необходимости вносить изменения каждый раз, когда происходит:

#define global_fd get_thread_fd()

И вуаля!

...