Потокобезопасные переменные в программировании Linux - PullRequest
4 голосов
/ 24 февраля 2010

Я пишу разделяемую библиотеку, которая позволит связанным приложениям запрашивать ресурс.

Класс ресурсов реализован только со статическими методами (см. Ниже). Он также использует глобальный объект (хорошо ограниченный в анонимном пространстве имен). Причина глобальной переменной заключается в том, что я не хочу раскрывать пользователей библиотеки внутренним частям системы. Полагаю, я мог бы использовать идиому pimpl, но это все еще не решает проблему безопасности потоков.

Класс выглядит примерно так:

//Header
class A
{
  public:
     static int foo();
     static double foobar();
};


// Source
namespace
{
   SomeResourceObject globvar;  // <- how can this variable be made thread safe ?
}

int A::foo(){}
double A::foobar(){}

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

Поэтому мой вопрос заключается в том, как реализовать глобвар, чтобы обеспечить безопасность потоков?

Я занимаюсь разработкой с использованием gcc 4.4.1 в Ubuntu 9.10

Ответы [ 3 ]

2 голосов
/ 24 февраля 2010

Как насчет обёртывания объекта globvar в классе и предоставления аксессоров / мутаторов, которые по своей природе используют мьютексы? Это должно дать вам некоторую безопасность потока.

1 голос
/ 24 февраля 2010

Оберните ваши объекты для обработки в повторяющихся блокировках, где бы вы к ним не обращались :) Здесь есть некоторый код на C ++, который позволяет вам реализовать механизм блокировки.Требуется усиление:

http://the -lazy-programmer.com / blog /? P = 39

Кажется довольно круто1010 * Убедитесь, что вы просматриваете комментарии, чтобы увидеть какие-либо исправления, внесенные людьми в код.

0 голосов
/ 12 ноября 2011

Если вам не нужно делить глобвар между потоками, и вы не создаете gazillion потоков, вам также следует рассмотреть возможность использования локального хранилища потоков .

Самое замечательное в TLS - нет необходимости в мьютексах, поэтому нет блокировки.

...